Android性能调优利器StrictMode

建议阅读:

Android性能调优利器StrictMode

使用严格模式提高代码质量

在 Android 开发中,“严苛模式(StrictMode)”是一个用于开发阶段的调试工具,它可以帮助你检测出一些可能导致性能问题或不良用户体验的代码行为。

一、什么是 StrictMode?

StrictMode 是 Android 在 API 9(Android 2.3)引入的机制,它可以检测出如下行为:

  • 在主线程中执行耗时操作(如文件读写、网络请求、数据库查询等)
  • 内存泄漏(如未关闭的 Cursor、InputStream)
  • 锁争用(慢的线程同步)
  • 不当的资源释放
  • 不必要的对象创建(如在 onDraw() 中)

二、怎么使用?

通常在 Application 的 onCreate() 方法中启用:

if (BuildConfig.DEBUG) {
    StrictMode.setThreadPolicy(
        StrictMode.ThreadPolicy.Builder()
            .detectAll()   // 检测所有线程级别的问题
            .penaltyLog()  // 打印日志
            .penaltyDialog() // 弹出对话框警告(仅限 Activity)
            .build()
    )

    StrictMode.setVmPolicy(
        StrictMode.VmPolicy.Builder()
            .detectAll()    // 检测所有 VM 级别的问题
            .penaltyLog()
            .build()
    )
}

三、常用的检测项

1. ThreadPolicy(线程层面)

  • detectDiskReads():检测磁盘读
  • detectDiskWrites():检测磁盘写
  • detectNetwork():检测网络访问
  • detectCustomSlowCalls():检测自定义慢调用(你可以手动标记)
  • detectResourceMismatches():资源类型不匹配(如 TypedArray 未回收)
  • detectUnbufferedIo():未使用缓冲的 I/O

2. VmPolicy(虚拟机层面)

  • detectLeakedClosableObjects():泄漏的可关闭对象(如未关闭的流)
  • detectLeakedSqlLiteObjects():泄漏的 SQLite 对象
  • detectLeakedRegistrationObjects():未注销的广播接收器
  • detectActivityLeaks():Activity 泄漏
  • detectFileUriExposure():使用了 file:// 而非 content://
  • detectCleartextNetwork():检测是否明文传输数据

四、惩罚机制(Penalty)

你可以选择以下几种反馈机制:

  • penaltyLog():打印到 logcat
  • penaltyDialog():弹出对话框警告
  • penaltyDeath():直接 crash
  • penaltyDeathOnNetwork():主线程网络访问时 crash
  • penaltyFlashScreen():屏幕闪红色提示(Android 11 起)

五、实际开发中怎么用?

  1. 调试阶段开启,上线版本关闭(如 BuildConfig.DEBUG 控制)
  2. 优先关注主线程中的磁盘/网络操作(如 ImageLoader、数据库)
  3. 结合日志定位实际发生的问题并优化

六、注意事项

  • 不会自动修复 你的代码,只是提示。
  • 在开发过程中使用可以发现潜在问题,不要在生产环境中启用
  • 有些检测项可能在某些系统版本中无法完整支持或行为不一致。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器