Android 性能优化(七)使用 StrictMode 进行性能检测

115 阅读1分钟

StrictMode 是一个开发者工具,用于捕获在应用主线程中发生的磁盘I/O、网络访问违例等问题。 StrictMode 有两个策略,一个是线程策略,即 TreadPolicy,如下所示:

StrictMode.setThreadPolicy(
    StrictMode.ThreadPolicy.Builder()
        .detectCustomSlowCalls() //配合StrictMode.noteSlowCall使用
        .detectDiskReads()//是否在主线程中进行磁盘读取
        .detectDiskWrites()//是否在主线程中进行磁盘写入
        .detectNetwork() // 是否在主线程中进行网络请求
        .penaltyDialog() //弹出违规提示对话框
        .penaltyLog() //在Logcat 中打印违规异常信息
        .penaltyFlashScreen() //会造成屏幕闪烁
        .penaltyDropBox()//将违规信息记录到 dropbox 系统日志目录中
        .build()
)

// noteSlowCall 用于触发耗时警告
@WorkerThread
public boolean compress(CompressFormat format, int quality, OutputStream stream) {
    ...
    
    StrictMode.noteSlowCall("Compression of a bitmap is slow");
    
    ...
    return result;
}

一个是VM策略,即 VmPolicy,如下所示:

StrictMode.setVmPolicy(
    StrictMode.VmPolicy.Builder()
        .detectActivityLeaks()//Activity是否内存泄漏
        .detectLeakedSqlLiteObjects()//数据库是否未关闭
        .detectLeakedClosableObjects()//文件是否未关闭
        .setClassInstanceLimit(MainActivity.class, 1) //某个类在内存中实例上限
        .detectLeakedRegistrationObjects()//对象是否被正确关闭
        .penaltyLog()//打印日志,可以通过 StrictMode 来过滤
        .penaltyDeath()//直接Crash掉当前应用程序
        .build()
)

我们也可以在需要的时候扩充StrictMode,代码如下所示:

StrictMode.ThreadPolicy oldThreadPolicy = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(oldThreadPolicy)
    .permitDiskWrites()  // 在原有策略的规则基础上,不监测读写磁盘
    .build());
 
StrictMode.VmPolicy oldVmPolicy = StrictMode.getVmPolicy();
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder(oldVmPolicy)
    .setClassInstanceLimit(MainActivity.class, 1) // 可以在内存中,设置 MainActivity.class 的实例为1
    .build());

参考