Android中关于严格模式StrictMode

从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方法中。

  • 实现方式一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
开启与否只在这里设置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());
}
  • 实现方式二

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    开启与否:使用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信息。

1
adb logcat | grep StrictMode
  • 手机端直观观察

除了通过日志查看之外,我们也可以在手机的开发者选项中开启严格模式,开启之后,如果主线程中有执行时间长的操作,屏幕则会闪烁,这是一个更加直接的方法。

待续

参考

Android性能调优利器StrictMode
Android系列——StrictMode使用详解