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 能夠根據上下文的描述分析是什麼違規致使。

相關文章
相關標籤/搜索