ANR監(jiān)控方案總結(jié)

1.前言

ANR比較棘手在于椿猎,沒有崩潰日志惶岭,定位問題比較困難,而且ANR是必須要解決的問題犯眠。

Android對ANR的監(jiān)控機制
Android應用程序是通過消息來驅(qū)動的按灶,Android某種意義上也可以說成是一個以消息驅(qū)動的系統(tǒng),UI筐咧、事件鸯旁、生命周期都和消息處理機制息息相關(guān)噪矛。Android的ANR監(jiān)測方案也是一樣,大部分就是利用了Android的消息機制铺罢。


anr.png

2.主流的ANR監(jiān)控方案

主流的ANR監(jiān)控方案:FileObserver艇挨,WatchDog,Looper.loop韭赘。它們都各有優(yōu)缺點缩滨,無法覆蓋所有情況,所以在線上使用的時候可以結(jié)合這幾種方案一起使用泉瞻。

2.1 FileObserver實現(xiàn)ANR監(jiān)控

當ANR發(fā)生的時候脉漏,我們是可以通過監(jiān)聽該文件目錄data/anr/的寫入情況來判斷是否發(fā)生了ANR,看起來這是一個不錯的時機袖牙。需要注意的是侧巨,所有應用發(fā)生ANR的時候都會進行回調(diào),因此需要做一些過濾與判斷鞭达,如包名刃泡、進程號等。

優(yōu)點:

  1. 基于原生接口調(diào)用碉怔,時機和內(nèi)容準確
  2. 無性能問題實現(xiàn)簡單

缺點:
最大的困難是兼容性問題烘贴,這個方案受限于Android系統(tǒng)的SELinux機制,5.0以后基本已經(jīng)使低權(quán)限應用無法監(jiān)聽到trace文件了撮胧,但是可以在開發(fā)內(nèi)測階段通過root手機進行監(jiān)控桨踪。

2.2 ANR-WatchDog實現(xiàn)ANR監(jiān)控

ANR-WatchDog是參考Android WatchDog機制(com.android.server.WatchDog.java)起個單獨線程向主線程發(fā)送一個變量+1操作的消息,然后自我休眠sleep 自定義ANR的閾值一般是5s芹啥,休眠過后判斷變量是否+1完成锻离,如果未完成則告警。

watchdog.png

優(yōu)點:

  1. 兼容性好墓怀,各個機型版本通用
  2. 無需修改APP邏輯代碼汽纠,非侵入式
  3. 邏輯簡單,性能影響不大

缺點:
無法保證能捕捉所有ANR傀履,對閾值的設置直接影響捕獲概率.比如如果設置了5s就無法捕獲10s的Receiver和20s的service 引起的ANR虱朵。

2.3 Looper.loop實現(xiàn)ANR監(jiān)控

巧妙的利用了Android原生Looper.loop中的一個log打印邏輯。
這個log打印邏輯正是在Message消息分發(fā)前后钓账,大部分的性能卡頓問題都是在這里發(fā)生的碴犬,監(jiān)控這兩個邏輯之間的時間差就可以得到當前主線程的卡頓狀態(tài),如果超時則獲取trace信息并上報梆暮。

實現(xiàn)原理:開啟子線程執(zhí)行服协,會消耗cpu資源,謹慎開啟,開發(fā)中一般針對部分用戶下發(fā)開關(guān):

  1. 設置Looper.setPrinter(自定義printer)實現(xiàn)println方法;
  2. 在消息執(zhí)行前后,Looper會調(diào)用
    Looper.mPriter.pritlin(“>>>>> dispatch msg.target msg.callBack,msg.what”)//子線程開啟收集線程堆棧信息
    Looper.mPriter.pritlin(“<<<<<< finish msg.target msg.callBack,msg.what”)//子線程結(jié)束收集線程堆棧信息
  3. 首先需要判斷msg.target的Looper是否等于主線程的Looper.
  4. 其次計算這兩個函數(shù)前后時間差是否超過200ms超過的話就上報堆棧調(diào)用信息啦粹。

優(yōu)點:

  1. 靈活配置可監(jiān)控常見APP應用性能也可作為一部分場景的ANR監(jiān)測,并且可以準確定位ANR和耗時調(diào)用棧。

  2. 谷歌已經(jīng)明確標注This must be in a local variable, in case a UI event sets the logger這個looger對象是可以被更改的肥惭,已經(jīng)有開發(fā)者遇到在使用WebView時logger被set為Null導致,進而造成監(jiān)控失敗忍饰。

3.如果dispatchMessage消息執(zhí)行的非常久是無法觸發(fā)監(jiān)控的邏輯。

4.無法監(jiān)控CPU資源緊張造成系統(tǒng)卡頓棒旗,無法響應的ANR

2.4 注冊信號函數(shù)

使用注冊信號函數(shù)機制監(jiān)聽SINGAL_QUIT信號喘批,可以監(jiān)聽ANR和Crash觸發(fā)邏輯撩荣∠橙啵可以作為FileObserver在5.0以后因權(quán)限問題無法監(jiān)測data/anr目錄的使用。
因為當應用發(fā)生crash和ANR的時候餐曹,系統(tǒng)會向目標進程發(fā)送SIGNAL_QUIT信號逛拱,應用虛擬機捕獲到信號以后會收集系統(tǒng)信息輸出到日志文件中(data/anr/trace.txt)然后kill掉目標進程。trace文件中數(shù)據(jù)過大台猴,可以根據(jù)當前時間節(jié)點和進程id進行信息過濾朽合。詳情參考:讓Native Crash 與ANR無處發(fā)泄

3.總結(jié)

ANR監(jiān)控方案各有優(yōu)劣,開發(fā)中一般組合多個共同使用饱狂。
Crash,ANR,卡頓最難的是異常信息的收集上傳曹步,收集到信息后可以根據(jù)日志進行分析進而解決問題。信息(一般是將日志保存在本地休讳,有效期限是七天)上傳一般都是通過開關(guān)動態(tài)下發(fā)的讲婚,目的是為了節(jié)省帶寬和服務端的存儲壓力。千萬級的用戶數(shù)據(jù)量會很大俊柔。

在灰度期間重點觀察指標是否正常筹麸,如果正常擴大灰度繼續(xù)觀察,不正常的話就停止灰度雏婶。然后定位問題是升級還是采用熱修復物赶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市留晚,隨后出現(xiàn)的幾起案子酵紫,更是在濱河造成了極大的恐慌,老刑警劉巖错维,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憨闰,死亡現(xiàn)場離奇詭異,居然都是意外死亡需五,警方通過查閱死者的電腦和手機鹉动,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宏邮,“玉大人泽示,你說我怎么就攤上這事缸血。” “怎么了械筛?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵捎泻,是天一觀的道長。 經(jīng)常有香客問我埋哟,道長笆豁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任赤赊,我火速辦了婚禮闯狱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抛计。我一直安慰自己哄孤,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布吹截。 她就那樣靜靜地躺著瘦陈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪波俄。 梳的紋絲不亂的頭發(fā)上晨逝,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音懦铺,去河邊找鬼捉貌。 笑死,一個胖子當著我的面吹牛阀趴,可吹牛的內(nèi)容都是我干的昏翰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼刘急,長吁一口氣:“原來是場噩夢啊……” “哼棚菊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叔汁,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤统求,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后据块,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體码邻,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年另假,在試婚紗的時候發(fā)現(xiàn)自己被綠了像屋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡边篮,死狀恐怖己莺,靈堂內(nèi)的尸體忽然破棺而出奏甫,到底是詐尸還是另有隱情,我是刑警寧澤凌受,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布阵子,位于F島的核電站,受9級特大地震影響胜蛉,放射性物質(zhì)發(fā)生泄漏挠进。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一誊册、第九天 我趴在偏房一處隱蔽的房頂上張望领突。 院中可真熱鬧,春花似錦解虱、人聲如沸攘须。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浮驳,卻和暖如春悍汛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背至会。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工离咐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奉件。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓宵蛀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親县貌。 傳聞我的和親對象是個殘疾皇子术陶,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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