android ANR逗柴、traces文件獲取及實(shí)例分析

概述:

當(dāng)Android應(yīng)用的UI線程被阻塞太久時(shí),就會(huì)觸發(fā)一個(gè)”Application Not Responding“(ANR)錯(cuò)誤院塞。如果APP運(yùn)行在前臺(tái)遮晚,系統(tǒng)就會(huì)彈出一個(gè)提示框,告知用戶拦止,用戶可以選擇繼續(xù)等待或者強(qiáng)制關(guān)掉县遣。如果app處于后臺(tái)則會(huì)直接被系統(tǒng)kill掉糜颠。

ANR的原因

ANR是因?yàn)樨?fù)責(zé)更新UI的主線程無(wú)法處理用戶輸入事件或繪制操作,而導(dǎo)致的糟糕體驗(yàn)萧求。

在Android中民傻,程序的響應(yīng)性是由Activity Manager與Window Manager系統(tǒng)服務(wù)來(lái)負(fù)責(zé)監(jiān)控的伸但,當(dāng)系統(tǒng)檢測(cè)到下面的條件之一時(shí)會(huì)顯示ANR的對(duì)話框:

(1) 對(duì)輸入事件(例如硬件點(diǎn)擊或者屏幕觸摸事件)害幅,5秒內(nèi)都無(wú)響應(yīng)赃绊。
(2) 前臺(tái)BroadcastReceiver不能在10秒內(nèi)結(jié)束接收到的任務(wù)。

ANR的觸發(fā)場(chǎng)景

(1) 在主線程執(zhí)行耗時(shí)的IO操作秒梳。
(2) 在主線程執(zhí)行耗時(shí)的計(jì)算法绵。
(3) 在主線程與其他進(jìn)程進(jìn)行同步的binder調(diào)用箕速,并且另一個(gè)進(jìn)程需要很長(zhǎng)時(shí)間才能返回酪碘。
(4) 主線程因等待其他線程的同步鎖( synchronized)而被長(zhǎng)時(shí)間阻塞。
(5) 主線程與另一個(gè)線程處于死鎖狀態(tài)盐茎。

檢測(cè)ANR

(1) Strict mode,使用 StrictMode可以幫助你在開(kāi)發(fā)的過(guò)程中發(fā)現(xiàn)在主線程意外的IO操作兴垦。

可以在Application、Activity或者其他應(yīng)用組件進(jìn)行配置:

public void onCreate() {   
  if (DEVELOPER_MODE) {        
 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()                 .detectDiskReads()                 
.detectDiskWrites() 
 .detectNetwork()   // or .detectAll() for all detectable problems                 .penaltyLog() 
.build());       
 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()                 .detectLeakedSqlLiteObjects()               
.detectLeakedClosableObjects()                
.penaltyLog()               
.penaltyDeath().build());    
 }    
 super.onCreate();}
(2) 允許后臺(tái)ANR彈窗

默認(rèn)情況下字柠,Android只顯示前臺(tái)ANR彈窗探越,如果需要允許顯示后臺(tái)ANR彈窗,就要到開(kāi)發(fā)者選項(xiàng)窑业,開(kāi)啟”Show all ANRs“钦幔。

(3)TraceView

使用Traceview去跟蹤正在運(yùn)行的應(yīng)用,并定位主線程忙碌的位置

(4)分析traces日志文件

當(dāng)發(fā)生ANR常柄,Android系統(tǒng)會(huì)存儲(chǔ)日志文件鲤氢。
日志路徑:
舊版系統(tǒng): /data/anr/traces.txt
新版系統(tǒng): /data/anr/anr_*
Android新系統(tǒng)因?yàn)樾枰猺oot權(quán)限所以會(huì)報(bào)錯(cuò)
remote open failed: Permission denied

如果沒(méi)有root可以使用一下方法導(dǎo)出全量文件:
adb bugreport
按照對(duì)應(yīng)路徑找到anr文件即可.

(5)如何避免ANR
(1)在工作線程中,執(zhí)行耗時(shí)操作西潘,如網(wǎng)絡(luò)卷玉、DB操作或者Bitmap大小調(diào)整的操作。
(2)使用AsyncTask來(lái)執(zhí)行耗時(shí)操作喷市。
(3)使用線程或者HandlerThread相种,要通過(guò) Process.setThreadPriority()并傳遞 THREAD_PRIORITY_BACKGROUND來(lái)設(shè)置線程的優(yōu)先級(jí)為”background“,不然這個(gè)線程仍然會(huì)使得你的應(yīng)用顯得卡頓品姓,因?yàn)楣ぷ骶€程默認(rèn)與UI線程有著同樣的優(yōu)先級(jí)寝并。
(4)避免在BroadcastReceiver中執(zhí)行耗時(shí)操作,如保存數(shù)據(jù)或者注冊(cè)一個(gè)Notification腹备。不能通過(guò)工作線程來(lái)執(zhí)行復(fù)雜的任務(wù)操作衬潦,而應(yīng)該啟動(dòng)一個(gè) IntentService來(lái)執(zhí)行耗時(shí)任務(wù)來(lái)響應(yīng)BroadcastReceiver中的長(zhǎng)時(shí)間任務(wù)。

1.traces文件

traces.txt系統(tǒng)自動(dòng)生成的記錄anr等異常的文件馏谨,只記錄java代碼產(chǎn)生的異常别渔。

2.traces文件的獲取

2.1 如果手機(jī)已經(jīng)是完全root了的或者是模擬器,可以直接通過(guò)DDMS的File Explorer直接導(dǎo)出來(lái),目錄在data/anr/traces.txt下。
2.2 如果不是root的手機(jī)哎媚,可以通過(guò)如下adb命令查看ANR日志文件位于哪里喇伯。

adb shell ls /data/anr/

當(dāng)發(fā)生ANR,Android系統(tǒng)會(huì)存儲(chǔ)日志文件拨与。
日志路徑:
舊版系統(tǒng): /data/anr/traces.txt
新版系統(tǒng): /data/anr/anr_*

然后通過(guò)adb的pull將日志文件拉取到指定的路徑稻据。
adb pull /data/anr/traces.txt d:/

但是如果手機(jī)沒(méi)有進(jìn)行root,執(zhí)行adb pull命令就會(huì)出現(xiàn)如下提示:
remote object ‘/data/anr/traces.txt’ does not exist

這時(shí)候我們可以使用adb將文件copy一份到sdcard买喧,然后再拉取出來(lái):

adb shell
cat /data/anr/traces.txt >/mnt/sdcard/traces.txt
exit

然后可以再?gòu)膕d卡考到項(xiàng)目目錄:
D:\demos\X5WebDemo>adb pull /mnt/sdcard/traces.txt ./traces.txt

3.線上用戶ANR信息捕獲方案

  1. Bugly監(jiān)控ANR異常方案捻悯,是通過(guò)FileObserver監(jiān)聽(tīng)trace文件寫(xiě)實(shí)現(xiàn)的。

2.當(dāng)ANR發(fā)生的時(shí)候淤毛,是通過(guò)監(jiān)聽(tīng)文件夾“data/anr/”的寫(xiě)入情況,來(lái)判斷是否發(fā)生了ANR今缚,如果監(jiān)聽(tīng)
到data/anr/traces.txt文件寫(xiě)入。說(shuō)明有此時(shí)有ANR異常發(fā)生然后將traces.txt文件上傳到服務(wù)器即可低淡。注意由于系統(tǒng)不同data/anr目錄下的文件可能有多個(gè)姓言,每個(gè)app發(fā)生anr信息時(shí)都會(huì)保存到該目錄,所以最終上傳的anr信息需要根據(jù)當(dāng)前進(jìn)程信息過(guò)濾掉非本應(yīng)用下的anr異常蔗蹋,具體可參考Bugly實(shí)現(xiàn)細(xì)節(jié)何荚。

3.FileObserver捕獲ANR異常,缺點(diǎn)是Android5.0低權(quán)限應(yīng)用不能監(jiān)聽(tīng)變化“、data/anr/traces.txt”猪杭,只能在root之后才可以餐塘。

// 偽代碼實(shí)現(xiàn)anr監(jiān)聽(tīng),上傳
private void startWatching() {
    final String anrFile = "data/anr/traces.txt"
    observer = new RecursiveFileObserver(anrFile, FileObserver.CLOSE_WRITE| FileObserver.MOVED_TO) { // set up a file observer to watch this directory on sd card
        @Override
        public void onEvent(int event, final String anrFile) {
                //1.開(kāi)啟工作線程上傳anrFile路徑文件到服務(wù)端皂吮,供問(wèn)題排查
                ·······
                //2.更新ui顯示
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                    //這里更新ui信息
                    }
                });
            }
        }
    };
    observer.startWatching();
}
 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載戒傻,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末涮较,一起剝皮案震驚了整個(gè)濱河市稠鼻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狂票,老刑警劉巖候齿,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闺属,居然都是意外死亡慌盯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)掂器,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亚皂,“玉大人,你說(shuō)我怎么就攤上這事国瓮∶鸨兀” “怎么了狞谱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)禁漓。 經(jīng)常有香客問(wèn)我跟衅,道長(zhǎng),這世上最難降的妖魔是什么播歼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任伶跷,我火速辦了婚禮,結(jié)果婚禮上秘狞,老公的妹妹穿的比我還像新娘叭莫。我一直安慰自己,他們只是感情好烁试,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布雇初。 她就那樣靜靜地躺著,像睡著了一般廓潜。 火紅的嫁衣襯著肌膚如雪抵皱。 梳的紋絲不亂的頭發(fā)上善榛,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天辩蛋,我揣著相機(jī)與錄音,去河邊找鬼移盆。 笑死悼院,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咒循。 我是一名探鬼主播据途,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叙甸!你這毒婦竟也來(lái)了颖医?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤裆蒸,失蹤者是張志新(化名)和其女友劉穎熔萧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體僚祷,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佛致,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辙谜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺榆。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖装哆,靈堂內(nèi)的尸體忽然破棺而出罐脊,到底是詐尸還是另有隱情定嗓,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布萍桌,位于F島的核電站蜕乡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梗夸。R本人自食惡果不足惜层玲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望反症。 院中可真熱鬧辛块,春花似錦、人聲如沸铅碍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胞谈。三九已至尘盼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烦绳,已是汗流浹背卿捎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留径密,地道東北人午阵。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像享扔,于是被迫代替她去往敵國(guó)和親底桂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 今天工作有點(diǎn)差錯(cuò)惧眠,剛處理完畢籽懦,有點(diǎn)心累。有的時(shí)候越忙越錯(cuò)氛魁,機(jī)制也有問(wèn)題暮顺,溝通成本增加,信息不對(duì)稱呆盖,核稿不仔細(xì)拖云。 今...
    魚(yú)飛舞閱讀 105評(píng)論 0 1
  • 有些事做一次是寶貴,再來(lái)一次便是浪費(fèi)应又。 這是一個(gè)有關(guān)夢(mèng)想的故事宙项,盡管這個(gè)夢(mèng)想最后未能實(shí)現(xiàn)。 8月株扛。學(xué)校進(jìn)行一次高三...
    知枕閱讀 225評(píng)論 0 1
  • 沉迷于簡(jiǎn)書(shū)和自己的愛(ài)好,已經(jīng)三天盆繁。這三天里掀淘,讓我的心情從低落抑郁調(diào)整到正常,也讓自己重新有了生活的信息油昂。 而革娄,周三...
    大鯨和小又閱讀 291評(píng)論 0 4
  • 常用命令 1、查看文件信息 ls 2冕碟、清屏:clearclear作用為清除終端上的顯示(類似于DOS的cls清屏功...
    nayli閱讀 317評(píng)論 0 8
  • 現(xiàn)在都已經(jīng)凌晨5點(diǎn)了拦惋,呵呵。 恐怕也就只有像我這樣的無(wú)所事事的人才沒(méi)睡吧安寺。 其實(shí)想想有時(shí)候農(nóng)村其實(shí)也有好處的厕妖,晚上...
    獨(dú)立意識(shí)生命體閱讀 215評(píng)論 3 1