从StrictMode是什么、怎么用来介绍安卓中的严格模式。
StrictMode是什么
StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具。
最常用的场景就是检测主线程中本地磁盘和网络读写等耗时的操作。
StrictMode最常用来捕捉应用程序的主线程,它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。
严格模式会将应用的违例细节暴露给开发者方便优化与改善。
StrictMode的检查策略
线程策略(TreadPolicy)
自定义的耗时调用 使用detectCustomSlowCalls()开启
磁盘读取操作 使用detectDiskReads()开启
磁盘写入操作 使用detectDiskWrites()开启
网络操作 使用detectNetwork()开启
VM策略(VmPolicy)
Activity泄露 使用detectActivityLeaks()开启
未关闭的Closable对象泄露 使用detectLeakedClosableObjects()开启
泄露的Sqlite对象 使用detectLeakedSqlLiteObjects()开启
检测实例数量 使用setClassInstanceLimit()开启
怎么使用StrictMode
严格模式需要在debug模式开启,不要在release版本中启用。
放在哪里
严格模式的开启可以放在Application或者Activity以及其他组件的onCreate方法。
为了更好地分析应用中的问题,建议放在Application的onCreate方法中。
- 实现方式一
|
|
实现方式二
123456789101112131415161718192021222324252627开启与否:使用AndroidMainifest文件中的debuggable属性来实现关于这个属性的解释:Whether or not the application can be debugged, even when running on a device in user mode— "true " if it can be, and "false " if not.The default value is "false ".-----------------------------------------------------------------------------android:debuggable="true"这段代码放在Application的onCreate方法中,一般放在最开始的地方。-----------------------------------------------------------------------------// Return if this application is not in debug modeApplicationInfo appInfo = context.getApplicationInfo();int appFlags = appInfo.flags;if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());}查看结果
严格模式有很多种报告违例的形式,但是想要分析具体违例情况,还是需要查看日志,终端下过滤StrictMode就能得到违例的具体stacktrace信息。
|
|
- 手机端直观观察
除了通过日志查看之外,我们也可以在手机的开发者选项中开启严格模式,开启之后,如果主线程中有执行时间长的操作,屏幕则会闪烁,这是一个更加直接的方法。