1. 什麼是ANR
ANR,英文全稱Application Not Responding,中文釋義爲應用程序無響應。當應用程序有一段時間響應不夠靈敏時,系統會向用戶展示一個對話框,用戶可以選擇”等待“讓程序繼續運行,或選擇“關閉應用”來強制關閉應用。
一個流暢的合理的應用程序中不能出現ANR,ANR會導致用戶體驗變差。默認情況下,在Android中Activity的最長執行時間是5秒,BroadcastReceiver的最長執行時間則是10秒。
2. 爲什麼會出現ANR
在Andorid系統中,通過Activity Manager和Window Manager服務來監控應用程序的響應情況,如果應用程序響應時間超出了限定時間,爲了避免對用戶體驗造成困擾,系統會彈出ANR對話框來讓用戶選擇是否繼續等待。
出現應用程序響應時間超出限定時間主要有以下幾種情況
-
主線程阻塞
在主線程中執行了大量耗時的操作,比如網絡請求(現在會拋出網絡請求不能放在主線程的異常),從數據庫中讀取大量數據,線程長時間休眠。
-
CPU滿負荷工作時進行I/0操作
當CPU滿負荷工作時,如果APP仍舊進行一些I/O操作,會導致ANR
-
內存不足
系統分配給每個應用程序的內存空間是一定的,如果APP中發生內存泄露等,會導致ANR
3. ANR日誌抓取
當應用程序發生ANR後,系統會在data/anr/目錄下生成一個traces.txt文件,文件內記錄了ANR產生時的一些系統信息,我們可以通過使用adb命令來將文件導出至本地。
在導出之前,我們可以先查看下設備ANR日誌是否存在
使用如下命令來將ANR日誌導出
adb pull data/anr/traces.txt 導出後的路徑
例如:
然後我們打開traces.txt進行分析
歡迎關注微信公衆號&新浪微博,一起交流,共同成長。