android性能检测工具--严苛模式(StrictMode)

严苛模式是安卓早期的性能检测工具代码,位于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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值