严苛模式是安卓早期的性能检测工具代码,位于android.os包下面的StrictMode类。开发中通过使用严苛模式,能监测代码中的主线程耗时原因和内存泄漏原因。
严苛模式的使用策略有两种。即监测耗时的线程策略(TreadPolicy),和监测内存泄漏的VM策略(VmPolicy)。
TreadPolicy
使用StrictMode一般定义到Application中,就可以全局的监测了,或者定义到指定activity以及其他组件的onCreate方法里用于局部监测。
严苛模式的代码是使用了构建者模式,我们需要通过build设置需要监测的规则和触发违规操作的响应方式。
StrictMode.ThreadPolicy.Builder builder = new StrictMode.ThreadPolicy.Builder();
builder.detectDiskReads()//检测执行磁盘读取的代码
.detectDiskWrites()//检测执行磁盘写入的代码
.detectNetwork()//检测执行请求网络写入的代码
.penaltyLog()//打印违规日志
StrictMode.setThreadPolicy(builder.build());
设置了上面的严苛模式后,当代码中使用主线程进行文件读取时就会打印对应的日志信息
StrictMode policy violation; ~duration=63 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=4521991 violation=2
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1293)
...
此模式的相关api如下:
//监测方式
builder.detectDiskReads();//监测执行磁盘读取的代码
builder.detectDiskWrites();//监测执行磁盘写入的代码
builder.detectNetwork();//监测执行请求网络写入的代码
builder.detectCustomSlowCalls();//监测自定义的执行缓慢或者潜在缓慢的代码
builder.detectAll();//监测全部
//触发违规的表现方式
builder.penaltyDialog();//弹出违规提示框
builder.penaltyLog();//打印违规日志
builder.penaltyDeath();//Crash掉当前应用程序
builder.penaltyFlashScreen();//造成屏幕闪烁
builder.penaltyDropBox();//违规信息记录到系统日志目录(/data/system/dropbox)
//关闭监测
builder.permitDiskReads();
builder.permitDiskWrites();
builder.permitNetwork();
builder.permitCustomSlowCalls();
builder.permitAll();
另外要触发自定义的监测,即detectCustomSlowCalls生效,需要我们手动在代码中调用noteSlowCall方法。
StrictMode.noteSlowCall("Custom ThreadPolicy===");
对应打印出的日志会为:
StrictMode policy violation; ~duration=9 ms: android.os.StrictMode$StrictModeCustomViolation: policy=196639 violation=8 msg=Custom ThreadPolicy===
at android.os.StrictMode$AndroidBlockGuardPolicy.onCustomSlowCall(StrictMode.java:1266)
...
日志中msg即我们自定义的信息,可以在里面输出耗时时间等信息。
VmPolicy
使用方法基本一致:
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
builder.detectActivityLeaks()//监测activity的内存泄漏
.penaltyLog();//打印违规日志
StrictMode.setVmPolicy(builder.build());
此模式的监测方式有:
builder.detectActivityLeaks();//监测activity的内存泄漏
builder.detectLeakedClosableObjects();//监测IO流、bitmap等资源内存泄漏
builder.detectLeakedSqlLiteObjects();//监测数据库内存泄漏
builder.detectLeakedClosableObjects();//监测数据库内存泄漏
builder.detectLeakedRegistrationObjects();//检测广播等注册类型的内存泄漏
另外此模式可以使用setClassInstanceLimit方法指定某对象的实例化次数,若超出限制即报违规。
//设置StrictModeActivity内存中只能存在一个实例化对象
builder.setClassInstanceLimit(StrictModeActivity.class, 1);