Android ANR

轉(zhuǎn)自:
http://rayleeya.iteye.com/blog/1955652
ANR的全稱是application not responding掠哥,意思就是程序未響應(yīng)。
默認(rèn)情況下腮介,在android中Activity的最長執(zhí)行時(shí)間是5秒,BroadcastReceiver的最長執(zhí)行時(shí)間則是10秒端衰。
在Android里叠洗,應(yīng)用程序的響應(yīng)性是由Activity Manager和WindowManager系統(tǒng)服務(wù)監(jiān)視的。當(dāng)它監(jiān)測(cè)到以下情況中的一個(gè)時(shí)旅东,Android就會(huì)針對(duì)特定的應(yīng)用程序顯示ANR:

  1. dispatchTimeout 輸入事件分發(fā)超時(shí)灭抑,一般是由于主線程(即UI線程)在5秒之內(nèi)沒有響應(yīng)輸入事件。(例如抵代,按鍵按下腾节,屏幕觸摸)
  2. BroadcastReceiver沒有在系統(tǒng)設(shè)定的時(shí)間內(nèi)(默認(rèn)10秒)完成并返回。
為什么會(huì)有ANR

ANR的產(chǎn)生需要同時(shí)滿足三個(gè)條件:
主線程:只有應(yīng)用程序進(jìn)程的主線程響應(yīng)超時(shí)才會(huì)產(chǎn)生ANR荤牍;
超時(shí)時(shí)間:產(chǎn)生ANR的上下文不同禀倔,超時(shí)時(shí)間也會(huì)不同,但只要在這個(gè)時(shí)間上限內(nèi)沒有響應(yīng)就會(huì)ANR参淫;
輸入事件/特定操作:輸入事件是指按鍵、觸屏等設(shè)備輸入事件愧杯,特定操作是指BroadcastReceiver和Service的生命周期中的各個(gè)函數(shù)涎才,產(chǎn)生ANR的上下文不同,導(dǎo)致ANR的原因也會(huì)不同力九。
針對(duì)這三個(gè)條件耍铜,有以下三種情況會(huì)觸發(fā)ANR,詳細(xì)說明如下跌前。

  • 主線程對(duì)輸入事件在5秒內(nèi)沒有處理完畢
    當(dāng)應(yīng)用程序的 Window 處于 Active 狀態(tài)并且能夠接收輸入事件(例如按鍵事件棕兼、觸摸事件等)時(shí),系統(tǒng)底層上報(bào)的事件就會(huì)被InputDispatcher分發(fā)給這個(gè)應(yīng)用程序抵乓,應(yīng)用程序的主線程通過InputChannel讀取輸入事件并交給界面視圖處理伴挚,界面視圖是一個(gè)樹狀結(jié)構(gòu),DecorView是視圖樹的根灾炭,事件從樹根開始一層一層向端點(diǎn)(例如一個(gè)Button)傳遞茎芋。我們通常會(huì)注冊(cè)一個(gè)監(jiān)聽器來接收并處理事件,或者創(chuàng)建自定義的視圖控件來處理事件蜈出。
    InputDispatcher運(yùn)行在系統(tǒng)進(jìn)程(進(jìn)程名為system_server)的一個(gè)單獨(dú)的線程中田弥,應(yīng)用程序的主線程在處理事件的過程中,InputDispatcher會(huì)不斷的檢測(cè)處理過程是否超時(shí)铡原,一旦超時(shí)偷厦,會(huì)通過一系列的回調(diào)通知WMS的notifyANR函數(shù)商叹,最終會(huì)調(diào)用到AMS中mHandler對(duì)象里的SHOW_NOT_RESPONDING_MSG這個(gè)case,此時(shí)界面上就顯示系統(tǒng)提示對(duì)話框了只泼,同時(shí)使用logcat命令查看log(日志信息)也可以看到關(guān)于ANR的信息剖笙。InputDispatcher就是那個(gè)愛打“小報(bào)告”的家伙。

Window:具體指的是PhoneWindow對(duì)象辜妓,表示一個(gè)能夠顯示的窗口枯途,它能夠接收系統(tǒng)分發(fā)的各種輸入事件;
InputDispatcher:將系統(tǒng)上報(bào)的輸入事件分發(fā)給當(dāng)前活動(dòng)的窗口籍滴;
InputChannel:InputDispatcher和應(yīng)用程序分別運(yùn)行在兩個(gè)不同的進(jìn)程中酪夷,InputDispatcher就是通過InputChannel將事件對(duì)象傳遞給應(yīng)用進(jìn)程的。

注意:產(chǎn)生這種ANR的前提是要有輸入事件孽惰,如果用戶沒有觸發(fā)任何輸入事件晚岭,即便是主線程阻塞了,也不會(huì)產(chǎn)生ANR勋功,因?yàn)镮nputDispatcher沒有分發(fā)事件給應(yīng)用程序坦报,當(dāng)然也不會(huì)檢測(cè)處理超時(shí)和報(bào)告ANR了。

  • 主線程在執(zhí)行BroadcastReceiver的onReceive函數(shù)時(shí)10秒內(nèi)沒有執(zhí)行完畢
    BroadcastReceiver(簡(jiǎn)稱BR)的onReceive函數(shù)運(yùn)行在主線程中狂鞋,當(dāng)這個(gè)函數(shù)超過10秒鐘沒有返回就會(huì)觸發(fā)ANR片择。不過對(duì)這種情況的ANR系統(tǒng)不會(huì)顯示對(duì)話框提示,僅是輸出log而已骚揍。
  • 主線程在執(zhí)行Service的各個(gè)生命周期函數(shù)時(shí)20秒內(nèi)沒有執(zhí)行完畢
    Service的各個(gè)生命周期函數(shù)也運(yùn)行在主線程中字管,當(dāng)這些函數(shù)超過20秒鐘沒有返回就會(huì)觸發(fā)ANR。同樣對(duì)這種情況的ANR系統(tǒng)也不會(huì)顯示對(duì)話框提示信不,僅是輸出log嘲叔。

三種ANR中只有第1種會(huì)顯示系統(tǒng)提示對(duì)話框,因?yàn)橛脩粽谧鼋缑娼换ゲ僮鞒榛睿绻L時(shí)間沒有任何響應(yīng)硫戈,會(huì)讓用戶懷疑設(shè)備死機(jī)了,大多數(shù)人此時(shí)會(huì)開始亂按下硕,甚至拔出電池重啟丁逝,給用戶的體驗(yàn)肯定是非常糟糕的。
三種ANR發(fā)生時(shí)都會(huì)在log中輸出錯(cuò)誤信息梭姓,你會(huì)發(fā)現(xiàn)各個(gè)應(yīng)用進(jìn)程和系統(tǒng)進(jìn)程的函數(shù)堆棧信息都輸出到了一個(gè)/data/anr/traces.txt的文件中果港,這個(gè)文件是分析ANR原因的關(guān)鍵文件,同時(shí)在日志中還會(huì)看到當(dāng)時(shí)的CPU使用率糊昙,這也是重要信息辛掠,在后面的章節(jié)會(huì)詳細(xì)介紹如何利用它們分析ANR問題。
這三種ANR不是孤立的,有可能會(huì)相互影響萝衩。例如一個(gè)應(yīng)用程序進(jìn)程中同時(shí)有一個(gè)正在顯示的Activity和一個(gè)正在處理消息的BroadcastReceiver回挽,它們都運(yùn)行在這個(gè)進(jìn)程的主線程中。如果BR的onReceive函數(shù)沒有返回猩谊,此時(shí)用戶點(diǎn)擊屏幕千劈,而onReceive超過5秒仍然沒有返回,主線程無法處理用戶輸入事件牌捷,就會(huì)引起第1種ANR墙牌。如果繼續(xù)超過10秒沒有返回,又會(huì)引起第2種ANR暗甥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喜滨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子撤防,更是在濱河造成了極大的恐慌虽风,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寄月,死亡現(xiàn)場(chǎng)離奇詭異辜膝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)漾肮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門厂抖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人克懊,你說我怎么就攤上這事验游。” “怎么了保檐?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長崔梗。 經(jīng)常有香客問我夜只,道長,這世上最難降的妖魔是什么蒜魄? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任扔亥,我火速辦了婚禮,結(jié)果婚禮上谈为,老公的妹妹穿的比我還像新娘旅挤。我一直安慰自己,他們只是感情好伞鲫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布粘茄。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柒瓣。 梳的紋絲不亂的頭發(fā)上儒搭,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音芙贫,去河邊找鬼搂鲫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛磺平,可吹牛的內(nèi)容都是我干的魂仍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拣挪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼擦酌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媒吗,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤仑氛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后闸英,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锯岖,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年甫何,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了出吹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辙喂,死狀恐怖捶牢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巍耗,我是刑警寧澤秋麸,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站炬太,受9級(jí)特大地震影響灸蟆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亲族,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一炒考、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霎迫,春花似錦斋枢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春缘滥,著一層夾襖步出監(jiān)牢的瞬間轰胁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工朝扼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赃阀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓擎颖,卻偏偏與公主長得像榛斯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搂捧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • ANR概述 首先,ANR(Application Not responding)是指應(yīng)用程序未響應(yīng)聋丝,Android...
    Android高級(jí)開發(fā)閱讀 2,536評(píng)論 1 19
  • 什么是Android ANR索烹? “ANR”是“Application Not Responding”的簡(jiǎn)寫,即應(yīng)用...
    小柏不是大白閱讀 444評(píng)論 0 0
  • 什么是ANR ANR(Application Not Responding)就是應(yīng)用在規(guī)定的時(shí)間內(nèi)沒有響應(yīng)用戶輸入...
    lbtrace閱讀 3,386評(píng)論 3 9
  • traces文件分析 簡(jiǎn)單了解ANR各個(gè)應(yīng)用進(jìn)程和系統(tǒng)進(jìn)程的函數(shù)堆棧信息都輸出到了/data/anr/traces...
    youseewhat閱讀 29,955評(píng)論 0 27
  • 下午六點(diǎn)團(tuán)隊(duì)領(lǐng)導(dǎo)讓我去一個(gè)小區(qū)弱睦。當(dāng)時(shí)我邀約了一個(gè)客戶百姓,在找機(jī)會(huì)談八月去公司的事情。聽到領(lǐng)導(dǎo)的吩咐况木,匆匆告別客戶垒拢,回...
    成驕閱讀 139評(píng)論 0 0