Android--ANR分析

1潘拨、ANR是什么?
ANR英文全稱Application Not Responding办素,通俗來(lái)說(shuō)就是程序未響應(yīng)淘正!如果一個(gè)應(yīng)用無(wú)法響應(yīng)用戶的輸入,系統(tǒng)就會(huì)彈出一個(gè)ANR的對(duì)話框拓提,如下圖所示读恃,用戶可以自行選擇繼續(xù)等待還是停止當(dāng)前程序。

2、出現(xiàn)場(chǎng)景
1寺惫、主線程被IO操作阻塞疹吃,
2、主線程做耗時(shí)操作西雀,
3萨驶、主線程錯(cuò)誤的操作,如Thread.wait或者Thread.sleep等

Android系統(tǒng)出現(xiàn)下面兩種情況艇肴,就會(huì)彈出ANR對(duì)話框
1腔呜、應(yīng)用在5秒內(nèi)未響應(yīng)用戶輸入事件
2、BroadcastReceiver未在10秒內(nèi)完成相關(guān)處理

如何避免
耗時(shí)的操作全部交給子工作線程來(lái)處理再悼,UI線程只做ui方面的操作核畴。
1、使用AsyncTask處理耗時(shí)IO操作帮哈。
2膛檀、使用Thread或者HandlerThread時(shí)锰镀,調(diào)用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)設(shè)置優(yōu)先級(jí)娘侍,否則仍然會(huì)降低程序響應(yīng),因?yàn)槟J(rèn)Thread的優(yōu)先級(jí)和主線程相同泳炉。
3憾筏、使用Handler處理工作線程結(jié)果,而不是使用Thread.wait()或者Thread.sleep()來(lái)阻塞主線程花鹅。
4氧腰、Activity的onCreate和onResume回調(diào)中盡量避免耗時(shí)的代碼
5、BroadcastReceiver中onReceive代碼也要盡量減少耗時(shí)刨肃,建議使用IntentService處理古拴。

如何定位
如果開(kāi)發(fā)機(jī)器上出現(xiàn)問(wèn)題,我們可以通過(guò)查看/data/anr/traces.txt即可真友,最新的ANR信息在最開(kāi)始部分黄痪。我們從stacktrace中即可找到出問(wèn)題的具體行數(shù)。本例中問(wèn)題出現(xiàn)在MainActivity.java 27行盔然,因?yàn)檫@里調(diào)用了Thread.sleep方法桅打。

root@htc_m8tl:/ # cat /data/anr/traces.txt | more


----- pid 30307 at 2015-05-30 14:51:14 -----
Cmd line: com.example.androidyue.bitmapdemo

JNI: CheckJNI is off; workarounds are off; pins=0; globals=272

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)

"main" prio=5 tid=1 TIMED_WAIT
  | group="main" sCount=1 dsCount=0 obj=0x416eaf18 self=0x416d8650
  | sysTid=30307 nice=0 sched=0/0 cgrp=apps handle=1074565528
  | state=S schedstat=( 0 0 0 ) utm=5 stm=4 core=3
  at java.lang.VMThread.sleep(Native Method)
  at java.lang.Thread.sleep(Thread.java:1044)
  at java.lang.Thread.sleep(Thread.java:1026)
  at com.example.androidyue.bitmapdemo.MainActivity$1.run(MainActivity.java:27)
  at android.app.Activity.runOnUiThread(Activity.java:4794)
  at com.example.androidyue.bitmapdemo.MainActivity.onResume(MainActivity.java:33)
  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1282)
  at android.app.Activity.performResume(Activity.java:5405)

** BroadcastReceiver過(guò)了60秒居然沒(méi)有ANR?**

public class NetworkReceiver extends BroadcastReceiver{
    private static final String LOGTAG = "NetworkReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(LOGTAG, "onReceive intent=" + intent);
        try {
            Thread.sleep(60000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.i(LOGTAG, "onReceive end");
    }
}

實(shí)際上已經(jīng)發(fā)生了ANR愈案,只是沒(méi)有進(jìn)行對(duì)話框彈出而已挺尾。這種ANR就是background ANR,即后臺(tái)程序的ANR站绪,我們可以通過(guò)過(guò)濾日志驗(yàn)證

adb logcat | grep "NetworkReceiver|ActivityManager|WindowManager"
I/NetworkReceiver( 4109): onReceive intent=Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x8000010 cmp=com.example.androidyue.bitmapdemo/.NetworkReceiver (has extras) }
I/ActivityManager(  462): No longer want com.android.exchange (pid 1054): empty #17
I/NetworkReceiver( 4109): onReceive end
W/BroadcastQueue(  462): Receiver during timeout: ResolveInfo{5342dde4 com.example.androidyue.bitmapdemo.NetworkReceiver p=0 o=0 m=0x108000}
E/ActivityManager(  462): ANR in com.example.androidyue.bitmapdemo
E/ActivityManager(  462): Reason: Broadcast of Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x8000010 cmp=com.example.androidyue.bitmapdemo/.NetworkReceiver (has extras) }
E/ActivityManager(  462): Load: 0.37 / 0.2 / 0.14
E/ActivityManager(  462): CPU usage from 26047ms to 0ms ago:
E/ActivityManager(  462):   0.4% 58/adbd: 0% user + 0.4% kernel / faults: 1501 minor
E/ActivityManager(  462):   0.3% 462/system_server: 0.1% user + 0.1% kernel
E/ActivityManager(  462):   0% 4109/com.example.androidyue.bitmapdemo: 0% user + 0% kernel / faults: 6 minor
E/ActivityManager(  462): 1.5% TOTAL: 0.5% user + 0.9% kernel + 0% softirq
E/ActivityManager(  462): CPU usage from 87ms to 589ms later:
E/ActivityManager(  462):   1.8% 58/adbd: 0% user + 1.8% kernel / faults: 30 minor
E/ActivityManager(  462):     1.8% 58/adbd: 0% user + 1.8% kernel
E/ActivityManager(  462): 4% TOTAL: 0% user + 4% kernel
W/ActivityManager(  462): Killing ProcessRecord{5326d418 4109:com.example.androidyue.bitmapdemo/u0a10063}: background ANR
I/ActivityManager(  462): Process com.example.androidyue.bitmapdemo (pid 4109) has died.

可以更容易了解background ANR么遭铺?
當(dāng)然可以,在Android開(kāi)發(fā)者選項(xiàng)—>高級(jí)—>顯示所有”應(yīng)用程序無(wú)響應(yīng)“勾選即可對(duì)后臺(tái)ANR也進(jìn)行彈窗顯示,方便查看了解程序運(yùn)行情況魂挂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末航厚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锰蓬,更是在濱河造成了極大的恐慌幔睬,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芹扭,死亡現(xiàn)場(chǎng)離奇詭異麻顶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)舱卡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)辅肾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人轮锥,你說(shuō)我怎么就攤上這事矫钓。” “怎么了舍杜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵新娜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我既绩,道長(zhǎng)概龄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任饲握,我火速辦了婚禮私杜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘救欧。我一直安慰自己衰粹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布笆怠。 她就那樣靜靜地躺著铝耻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骑疆。 梳的紋絲不亂的頭發(fā)上田篇,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音箍铭,去河邊找鬼泊柬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诈火,可吹牛的內(nèi)容都是我干的兽赁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刀崖!你這毒婦竟也來(lái)了惊科?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亮钦,失蹤者是張志新(化名)和其女友劉穎馆截,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜂莉,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜡娶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了映穗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窖张。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚁滋,靈堂內(nèi)的尸體忽然破棺而出宿接,到底是詐尸還是另有隱情,我是刑警寧澤辕录,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布睦霎,位于F島的核電站,受9級(jí)特大地震影響踏拜,放射性物質(zhì)發(fā)生泄漏碎赢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一速梗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧襟齿,春花似錦姻锁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至开皿,卻和暖如春涧黄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赋荆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工笋妥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窄潭。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓春宣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子月帝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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