ANR 分析思路淺析

1、引言java

      ANR問題是android中常見且使人頭疼的問題,至關多的時候不易直接分析出緣由。android

 

2、ANR的定義     網絡

     下面先看下百度百科給ANR的定義:佈局

      ANR問題常因在main(主線程)線程執行了複雜耗時的操做,好比文件IO、網絡訪問、無限循環等,最終無奈地被系統拋出ANR。spa

 

3、ANR的通常分析思路線程

      1) 從手機的/data/traces/目錄導出traces.txt文件;3d

      2) 從traces.txt文件獲取ANR產生的時間點T1;日誌

      3) 從traces.txt文件獲取main線程的運行狀態、調用棧;blog

      4) 查看logcat日誌,搜索"ANR in",找出ANR產生的時間點T2,以及時間點T2 先後幾秒鐘,在系統中運行的各進程CPU耗時佔比;進程

      5) 在步驟4)找出目標進程的cpu耗時佔比,確認是user佔比高,仍是kernel佔比高,仍是iowait佔比高;

      6) 根據時間點T一、時間點T2,校準ANR產生的時間範圍 [T1, T2] 或 [T2, T1];

      7) 查看logcat日誌,將日誌定位到步驟2)中獲取的時間點 [T1, T2] 或 [T2, T1]附近;

      8) 查看logcat日誌在時間點 [T1, T2] 或 [T2, T1]附近先後2分鐘的日誌,以還原ANR產生先後的場景;

      9) 根據以上步驟得出的信息,定位代碼中可能的問題代碼塊;

      10) 解決問題,或提出階段分析結論。

 

4、ANR的分析示例

       產生ANR後,系統會在/data/traces/下生成traces.txt文件,咱們首先將該traces.txt文件從手機對應的目錄導出。

      打開traces.txt後,先確認產生ANR的進程及ANR產生時間,以下圖紅框所示,產生ANR的進程是cn.evergrande.it.phone,ANR產生的時間是2018-08-16 10:34:43

注意,在ANR分析中,ANR產生的時間點很是重要,是串接traces.txt和logcat相關日誌線索的鏈接線,是推理ANR產生緣由的重要線索。

 

   繼續分析traces.txt,找到cn.evergrande.it.phone進程的main線程調用棧快照,以下圖所示,main線程在2018-08-16 10:34:43處於Runnable狀態,而且正在

執行java層代碼以測量layout佈局中的RecylerView。

  查看logcat日誌,搜索"ANR in",定位到以下圖所示的CPU usage from 35958ms to 0ms ago部分的日誌,可知 2018-08-16 10:34:07.5462018-08-16 10:34:43.504 時間段,cn.evergrande.it.phone進程並無較多的cpu佔比。

   繼續查看CPU usage from 372ms to 893ms later部分的日誌,可知在 2018-08-16 10:34:43.8772018-08-16 10:34:44.398 時間段,ANR問題開始出現,

其中cn.evergrande.it.phone進程的grande.it.phone、HDLogicThread-二、ReqTimer三個線程的cpu佔比都比較高,可推斷是cn.evergrande.it.phone進程引起了ANR。

 

     綜合上述ago、later兩部分的ANR日誌,基本能夠判定ANR產生的源頭是cn.evergrande.it.phone進程,

       其中,線程grande.it.phone的線程id是2097四、HDLogicThread-2的線程id是21000,ReqTimer的線程id是20974,而在traces.txt中,main的線程id是20974,因此可判定是

cn.evergrande.it.phone進程阻塞引起了ANR。

  接下來要確認ANR產生的緣由,先校準ANR產生的時間點,

  1) traces.txt給出的時間點是 2018-08-16 10:34:43

  2) logcat給出的時間範圍是  2018-08-16 10:34:43.877 到 2018-08-16 10:34:44.398

   綜合1)、2)時間(點)的交集,校準後的ANR產生時間範圍是 2018-08-16 10:34:43.877 到 2018-08-16 10:34:44.398。

  接下來,查看logcat在 2018-08-16 10:34:43.877 到 2018-08-16 10:34:44.398範圍的日誌,還原ANR產生時的情景。

  上圖日誌顯示了logcat在 2018-08-16 10:34:43.877 到 2018-08-16 10:34:44.398附近的日誌,可還原出此時間段系統正在播放音樂、用戶正在操做進度條控制音樂的播放,

但並無與ANR產生緣由相關的線索,因爲traces.txt是在main線程Runnable時生成的,因此不能從main的調用棧分析出ANR產生的可能緣由。

 

5、小結

  第四節中舉的示例是沒有足夠數據,以分析出產生ANR的緣由,但本文旨在告訴讀者一種分析ANR的思路,以供你們借鑑和不斷完善。

相關文章
相關標籤/搜索