ANR原因及解決方法

weixin_33751566發表於2017-07-07

一、什麼是ANR

ANR: Application not responding (應用無響應),系統會向使用者顯示一個對話方塊,使用者可以選擇“等待”而讓程式繼續執行,也可以選擇“強制關閉”

二、ANR的型別

1、keyDispatchTimeout(5s)   --   主要型別

     按鍵或觸控事件在特定時間內無響應(按鍵按下、螢幕觸控等)

2、BroadcastTimeout(10 seconds)

       BroadcastReceiver在特定時間內無法處理完成

3、ServiceTimeout(20 seconds)   --   小概率型別

       Service在特定的時間內無法處理完成

三、如何分析ANR

ANR產生的原因是要有輸入事件,若使用者沒有輸入任何事件,即使主執行緒阻塞了,也不會ANR,因為InputDispatcher沒有分發事件給應用程式,當然也不會檢測處理超時和報告ANR了

1)ANR發生時都會在log中輸出錯誤資訊,從log中可以獲得ANR的型別,CPU的使用情況:

CPU使用率過高有可能是CPU飢餓導致了ANR;

CPU使用率過低說明主執行緒被block了;

如果IOwait高是因為主執行緒進行I/O操作造成的。

2)除了看LOG,還可以從trace.txt檔案檢視呼叫stack。可以用如下命令獲取trace.txt

$chmod 777 /data/anr

$rm /data/anr/traces.txt

$ps

$kill -3 PID

adbpull data/anr/traces.txt ./mytraces.txt

四、如何避免ANR

(1)避免在主執行緒上進行復雜耗時的操作,比如說傳送接收網路資料/進行大量計算/運算元據庫/讀寫檔案等。這個可以通過使用AsyncTask或者使用多執行緒來實現。

(2)broadCastReceiver 要進行復雜操作的的時候,可以在onReceive()方法中啟動一個Service來處理

(3)在設計及程式碼編寫階段避免出現出現同步/死鎖或者錯誤處理不恰當等情況。

總結

主執行緒阻塞/掛起、死迴圈、記憶體洩漏、執行耗時操作、記憶體過大、CPU佔用過高(檔案讀寫頻繁)都會造成crash


參考文件:如何分析解決Android ANR

                   ANR原因分析及解決方法

相關文章