Android App 性能優化之穩定性

Android App性能優化之穩定性問題分類

1. ANR
2. Crash
3. 應用退出

1. ANR
ANR(Application Not Responding 應用程序無響應)
1.1大致可分爲三類情況:

  • 輸入事件響應超時(主要類型):主線程(“事件處理線程”、“UI線程”)在5秒內沒有響應輸入事件。
  • 廣播接收處理超時:BroadcastReceiver 沒有在10秒內完成返回。

前臺廣播爲10s,後臺廣播爲60s,默認發送的爲後臺廣播
發送廣播時,攜帶Intent.FLAG_RECEIVER_FOREGROUND將廣播設置爲前臺廣播

  • Service服務處理超時(小概率事件):Service在20秒(前臺5s,後臺service爲200s,默認爲後臺服務)內沒有執行完成應用發起的service請求。

前臺服務:超時時間爲5s,通過startForegroundService將指定服務指定爲前臺服務,會在notification中存在提示信息。
被前臺進程binder的服務:service服務被前臺進程binder,那麼此服務的超時時間爲20s。
被後臺進程binder的服務:service服務被後臺進程binder,那麼此服務的超時時間爲200s。

1.2 原因分析

  • 程序自身主線程問題引起的ANR,通過ANR的tombstone backtrace定位。

主進程進行IO文件操作。
主進程進行大量頻繁的數據庫操作。
主進程進入死循環

  • iowait過高,此類異常是後臺有進程在進行大量io磁盤操作。
  • cpu佔用率過高,查看backtrace中cpu信息,查看哪個進程佔用cpu較高,具體分析較高的進程是否正常。
  • 內存過低,手機在內存過低的情況下,系統會不斷kill掉優先級低進程。

1.3 排查流程

  • Log獲取

抓取bugreport,輸入命令:adb shell bugreport > bugreport.txt
直接導出/data/anr/traces.txt文件,輸入命令:adb pull /data/anr/traces.txt trace.txt

  • 搜索 “ANR in” 處的log關鍵點解讀

2. Crash
2.1 Crash 出現的常見場景

  • NullPointerException 空指針
  • IndexOutOfBoundsException 下標越界異常
  • ClassCastException 類型轉換異常
  • ActivityNotFoundException Activity 未找到異常
  • IllegalStateException 非法狀態異常
  • SecurityException 安全異常
  • ArrayIndexOutOfBoundsException 數組越界異常
  • OOM OutOfMemoryError 內存溢出

減少對象的內存佔用
內存對象的重複使用
避免對象的內存泄漏
內存使用策略優化

  • 內存泄漏

LeakCanary 內存泄漏檢測工具
https://github.com/square/leakcanary

  • 依賴庫問題

Android App 經常會以來很多aar,每個aar可能有多個版本,如果互相依賴的aar有不兼容的辦辦,存在的問題在打包時不能發現的,只有在相關代碼執行時纔會出現,會造成比如NoClassDefFoundError、NoSuchMethodError、NoSuchFieldError等異常。

3. 應用退出

  • 主動自殺
  • Process.killProcess()、exit()
  • 崩潰
  • 系統重啓
  • 系統異常、斷電等
  • 被系統殺死
  • 被LMK殺死、從系統的任務管理器中劃掉等
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章