轉(zhuǎn)自:http://rayleeya.iteye.com/blog/1955652
如果你是一個Android應用程序開發(fā)人員,你的人生中不可避免的三件事情是:死亡擂找、繳稅和ANR。這么說是夸張了贯涎,但是由于Android本身的設(shè)計,以及應用程序和系統(tǒng)在開發(fā)過程中的缺陷陆盘,經(jīng)常會在測試過程中遇到各種各樣的ANR問題败明。在功能性的測試中還少一些,主要是在壓力測試中(例如Monkey測試)會遇到非常多的ANR問題妻顶。本章的目的就是匯總筆者在工作中遇到的各種ANR問題,將其歸納總結(jié)出一套分析和處理ANR問題的方法幔嗦,希望能夠通過這套方法為大家提供思路沥潭,有效的減少大家處理ANR問題的時間。同時也會給出一些避免ANR的最佳實踐汇恤,更多的從預防做起,更少的做事后補救屁置。
考慮到看本文的讀者大多是有實際經(jīng)驗的開發(fā)人員,我會盡量少的提到一些基礎(chǔ)的概念阱穗,我也希望給大家更多的“干貨”使鹅。
本章的主要內(nèi)容如下:
- ANR簡介(什么是ANR、為什么會有ANR鲁僚、ANR的異常長什么樣)
- 如何分析ANR(引起ANR的原因分類裁厅、分析ANR的利器)
- 實例講解
- 避免ANR的最佳實踐(從錯誤中吸取教訓)
ANR簡介
ANR是“Application Not Responding”的縮寫,即“應用程序無響應”执虹。在Android中,ActivityManagerService(簡稱AMS)和WindowManagerService(簡稱WMS)會監(jiān)測應用程序的響應時間侥啤,如果應用程序主線程(即UI線程)在超時時間內(nèi)對輸入事件沒有處理完畢茬故,或者對特定操作沒有執(zhí)行完畢,就會出現(xiàn)ANR磺芭。對于輸入事件沒有處理完畢產(chǎn)生的ANR赁炎,Android會顯示一個對話框甘邀,提示用戶當前應用程序沒有響應垮庐,用戶可以選擇繼續(xù)等待或者關(guān)閉這個應用程序(也就是殺掉這個應用程序的進程)哨查。
為什么會有ANR
如上所述,ANR的產(chǎn)生需要同時滿足三個條件:
- 主線程:只有應用程序進程的主線程響應超時才會產(chǎn)生ANR寒亥。
- 超時時間:產(chǎn)生ANR的上下文不同,超時時間也會不同溉奕,但只要在這個時間上限內(nèi)沒有響應就會ANR。
- 輸入事件/特定操作:輸入事件是指按鍵仙辟、觸屏等設(shè)備輸入事件,特定操作是指BroadcastReceiver和Service的生命周期中的各個函數(shù)叠国,產(chǎn)生ANR的上下文不同戴尸,導致ANR的原因也會不同。
針對這三個條件项棠,有以下三種情況會觸發(fā)ANR,詳細說明如下香追。
主線程對輸入事件在5秒內(nèi)沒有處理完畢