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殺死、從系統的任務管理器中劃掉等