Android 应用性能优化-StrictMode(严格模式)

UI线程若是被阻塞5秒的话,那么应用程序此时就会弹出ANR的对话框,ANR对应用程序来讲是一个很严重的问题。 如何防止应用程序出现ANR,怎么分析查看致使ANR问题的缘由? 咱们来介绍Android的严格模式。java

怎样开启严格模式android

有两种开启方式。shell

  • 开发者选项

进入开发者选项,里面找到启用严格模式,打开。 当应用主线程执行长时间操做的话会闪锁屏幕。网络

  • StrictMode API(代码调用)

能够在Activity或者自定义的Application类的onCreate方法里面开启StrictMode。ui

// 设置线程策略
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads() // 磁盘读
    .detectDiskWrites() // 磁盘写
    .detectNetwork()   // 网络
    .penaltyLog()
    .build());

// 设置VM策略
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
    .detectActivityLeaks()
    .detectLeakedSqlLiteObjects() // SQLite 对象
    .detectLeakedClosableObjects() 
    .penaltyLog()
    .penaltyDeath() // 触发违规操做,kill应用
    .build());

怎样使用StrictMode API线程

StrictMode能够理解为设置策略、侦测违规操做、惩罚。code

设置策略有两种对象

  • setThreadPolicy // 设置线程策略
  • setVmPolicy // 设置VM策略

侦测违规操做包含以下,可分为线程策略可侦测的违规操做和 VM策略可侦测的违规操做进程

线程策略可侦测的违规操做内存

  • detectDiskReads()
  • detectDiskWrites()
  • detectNetwork()
  • detectCustomSlowCalls()

VM策略可侦测的违规操做

  • detectActivityLeaks()
  • detectLeakedSqlLiteObjects()
  • detectLeakedClosableObjects()
  • detectFileUriExposure()
  • detectLeakedRegistrationObjects()

惩罚方式

  • penaltyLog() // 打印log
  • penaltyDeath() // 杀掉进程
  • penaltyDialog() // 弹出对话框

怎样分析StrictMode Log

能够经过 adb shell 来过滤StrictMode log。

adb logcat -s StrictMode

过滤StrictMode log以下:

02-12 21:43:41.580: E/StrictMode(14269): class com.test.TestActivity; instances=2; limit=1
02-12 21:43:41.580: E/StrictMode(14269): android.os.StrictMode$InstanceCountViolation: class com.example.testa.BActivity; instances=2; limit=1
02-12 21:43:41.580: E/StrictMode(14269): at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)

instances=2 limit=1,说名限制的TestActivity实例只能是一个,却有两个实例,说明TestActivity有内存泄漏。

其余StrictMode Log 能够根据上下文的描述分析是什么违规致使。

相关文章
相关标签/搜索