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

  • 实现方式一
开启与否只在这里设置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
  • 手机端直观观察

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

待续

参考

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

你可能感兴趣的:(StrictMode:安卓中的严格模式)