ANR全稱:Application Not Responding,即應用程序未響應。
主要原因:
應用程序進程中的主線程響應超時,則會產生ANR
(1)應用程序自身引起的。比如:主線程阻塞、掛起、死循環、執行比較長的耗時操作
(2)其他進程引起的。比如:其他進程對CPU的時間占用率過高,導致應用進程搶不到CPU的時間片。
響應超時體現:
(1)應用程序的主線程對輸入事件,5s內沒有處理完畢
(2)應用程序主線程在執行BroadcastReceiver的onReceive()函數時,10s內沒有處理完畢
(3)應用程序主線程在執行Service的各個生命周期函數時,20s內沒有處理完畢
解決步驟:
當發生ANR的時候,ActivityManagerService(AMS)會把ANR信息寫到LogCat日志中。我們打開Android Device Monitor查看LogCat日志,主要通過ANRManager、ActivityManager等字段過濾出我們想要的信息,保存到文件。文件主要看以下幾條信息:
(1)ANR In (Process Name)【Short Component Name】即ANR發生在哪個進程,哪個包/類里,定位到類。
(2)PID ?應用程序進程ID
(3)Reason ?ANR發生的原因提示。有:Input dispatching timed out.(輸入事件引起的ANR);ExecutingService...(Service執行任務引起的ANR);Broadcast of ...(廣播引起的ANR)
(4)Process CPU state ?分析各進程的時間占用率,來判斷某些進程是否長期占用CPU過高,導致應用進程獲取不到足夠的CPU處理時間,而發生ANR。比如:各進程總的CPU占用率,用戶CPU時間占用率、系統CPU時間占用率、iowaitCPU時間占用率
總結:
ANR在日常開發過程中,主要還是應用程序的主線程做了過多耗時操作導致,耗時操作放在子線程即可。