时间:2021-05-20
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线程中进行了网络操作或者文件系统的操作,而这些缓慢的操作会严重影响应用的响应能力,甚至出现ANR对话框。为了在开发中发现这些容易忽略的问题,我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,最终帮助开发者优化和改善代码逻辑。
官网文档:http://developer.android.com/reference/android/os/StrictMode.html
StrictMode具体能检测什么
严苛模式主要检测两大问题,一个是线程策略,即TreadPolicy,另一个是VM策略,即VmPolicy。
ThreadPolicy线程策略检测
VmPolicy虚拟机策略检测
工作原理
其实StrictMode实现原理也比较简单,以IO操作为例,主要是通过在open,read,write,close时进行监控。libcore.io.BlockGuardOs文件就是监控的地方。以open为例,如下进行监控。
@Overridepublic FileDescriptor open(String path, int flags, int mode) throws ErrnoException { BlockGuard.getThreadPolicy().onReadFromDisk(); if ((mode & O_ACCMODE) != O_RDONLY) { BlockGuard.getThreadPolicy().onWriteToDisk(); } return os.open(path, flags, mode);}其中onReadFromDisk()方法的实现,代码位于StrictMode.java中。
public void onReadFromDisk() { if ((mPolicyMask & DETECT_DISK_READ) == 0) { return; } if (tooManyViolationsThisLoop()) { return; } BlockGuard.BlockGuardPolicyException e = new StrictModeDiskReadViolation(mPolicyMask); e.fillInStackTrace(); startHandlingViolationException(e);}常见用法
严格模式的开启可以放在Application或者Activity以及其他组件的onCreate方法。为了更好地分析应用中的问题,建议放在Application的onCreate方法中。
其中,我们只需要在app的开发版本下使用 StrictMode,线上版本避免使用 StrictMode,这里定义了一个布尔值变量DEV_MODE来进行控制。
private boolean DEV_MODE = true; public void onCreate() { if (DEV_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyDialog() //弹出违规提示对话框 .penaltyLog() //在Logcat 中打印违规异常信息 .penaltyFlashScreen() //API等级11 .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() //API等级11 .penaltyLog() .penaltyDeath() .build()); } super.onCreate(); }其中Android3.0引入的方法包括detectCustomSlowCalls()和noteSlowCode(),它们都是用来检测应用中执行缓慢代码的或者潜在的缓慢代码。
查看报告结果
严格模式有很多种报告违例的形式,但是想要分析具体违例情况,还是需要查看日志,终端下过滤StrictMode就能得到违例的具体stacktrace信息。
adb logcat | grep StrictMode当然也可以选择弹窗形式来简明提醒开发者
弹窗警告
ThreadPolicy 详解
StrictMode.ThreadPolicy.Builder 主要方法如下
detectNetwork() 用于检查UI线程中是否有网络请求操作
检测UI线程中网络请求案例:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button btnTest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectNetwork() .penaltyLog() .build()); btnTest = (Button) findViewById(R.id.btn_test); btnTest.setOnClickListener(this); } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.btn_test: postNetwork(); break; } } /** * 网络连接的操作 */ private void postNetwork() { try { URL url = new URL("http://patActivity implements View.OnClickListener { private static class CastielClass{} private static List<CastielClass> classList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); classList = new ArrayList<CastielClass>(); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .setClassInstanceLimit(CastielClass.class, 2) .penaltyLog() .build()); classList.add(new CastielClass()); classList.add(new CastielClass()); classList.add(new CastielClass()); classList.add(new CastielClass()); classList.add(new CastielClass()); classList.add(new CastielClass()); classList.add(new CastielClass()); classList.add(new CastielClass()); }}运行后触发警告如下
其他操作
除了通过日志查看之外,我们也可以在开发者选项中开启严格模式,开启之后,如果主线程中有执行时间长的操作,屏幕则会闪烁,这是一个更加直接的方法。
注意事项
总结
以上所述是小编给大家介绍的Android严苛模式StrictMode使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Android2.3提供一个称为严苛模式StrictMode的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么
严格模式(StrictMode)是ECMAScript5新增的功能。ECMAScript5虽然可以向后兼容ECMAScript3,但如果使用严格模式,哪些ECM
在Android7.0的手机上,自动更新的时候出现包解析异常,在其他的手机上没有这个问题。原因:Android7.0引入私有目录被限制访问和StrictMode
Android两种启动模式的实例详解Intent的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONTA
一、概述除了正常运行模式,ECMAscript5添加了第二种运行模式:“严格模式”(strictmode)。顾名思义,这种模式使得Javascript在更严格的