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方法中。
- 实现方式一
开启与否只在这里设置true或者false就可以了
---------------------------------------------------------------------------
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
}
这段代码放在Application的onCreate方法中,一般放在最开始的地方。
-----------------------------------------------------------------------------
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.build());
}
- 实现方式二
开启与否:使用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 mode
ApplicationInfo 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信息。
adb logcat | grep StrictMode
- 手机端直观观察
除了通过日志查看之外,我们也可以在手机的开发者选项中开启严格模式,开启之后,如果主线程中有执行时间长的操作,屏幕则会闪烁,这是一个更加直接的方法。