ANR是個什么玩意
ANR,是“Application Not Responding”的縮寫,即“應用程序無響應”。系統會向用戶顯示一個對話框,用戶可以選擇“等待”而讓程序繼續運行,也可以選擇“強制關閉”。
在Android中,應用程序的響應是由Activity Manager和WindowManager系統服務監視的 。當它監測到A、B、C情況中的一個時,Android就會針對特定的應用程序顯示ANR:
A.在5秒內沒有響應輸入的事件(例如,按鍵按下,屏幕觸摸)--主要類型
B.BroadcastReceiver在10秒內沒有執行完畢
C.Service在特定時間內(20秒內)無法處理完成--小概率類型
造成ABC的原因有很多,比如在主線程中做了非常耗時的操作,如下載,io異常等。還需要注意的是產生這種ANR的前提是要有輸入事件,如果用戶沒有觸發任何輸入事件,即便是主線程阻塞了,也不會產生ANR,因為InputDispatcher沒有分發事件給應用程序,當然也不會檢測處理超時和報告ANR了。
1.如何分析ANR
ANR發生時都會在log中輸出錯誤信息,從log中可以獲得ANR的類型,CPU的使用情況,CPU使用率過高有可能是CPU饑餓導致了ANR。CPU使用率過低說明主線程被block了,如果IOwait高是因為主線程進行I/O操作造成的。
除了log輸出外,你會發現各個應用進程和系統進程的函數堆棧信息都輸出到了一個/data/anr/traces.txt的文件中,這個文件是分析ANR原因的關鍵文件.要獲取到該文件可使用adb指令進行賦權后拉出查看調用stack。通過log、trace.text、代碼結合分析ANR的成因(iowait?Memoryleak?Block?)
2.怎么避免ANR
要避免問題的產生,就要抓住問題產生的原因(ABC三種):
(1)避免在主線程上進行復雜耗時的操作,比如說發送接收網絡數據/進行大量計算/操作數據庫/讀寫文件等。這個可以通過使用AsyncTask或者使用多線程來實現。
(2)broadCastReceiver 要進行復雜操作的的時候,可以在onReceive()方法中啟動一個Service來處理
(3)在設計及代碼編寫階段避免出現出現同步/死鎖或者錯誤處理不恰當等情況。
作者:youseewhat
鏈接:http://www.lxweimin.com/p/9db73a26a8bd
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。