Android ANR問題產生和分析

ANR產生原因

1.ANR(Application Not Response 應用程序無響應)。
2.如果 Android 應用的界面線程處於阻塞狀態的時間過長,會觸發“應用無響應”(ANR) 錯誤。如果應用位於前臺,系統會向用戶顯示一個對話框,如下圖所示。ANR 對話框會爲用戶提供強行退出應用的選項。
在這裏插入圖片描述
3.何時會觸發
InputDispatching Timeout:5秒內無法響應屏幕觸摸事件或鍵盤輸入事件
BroadcastQueue Timeout :在執行前臺廣播(BroadcastReceiver)的onReceive()函數時10秒沒有處理完成,後臺爲60秒。
Service Timeout :前臺服務20秒內,後臺服務在200秒內沒有執行完畢。
ContentProvider Timeout :ContentProvider的publish在10s內沒進行完。

ANR診斷

1.幾種常見ANR模式

  • 應用在主線程上非常緩慢地執行涉及 I/O 的操作。
  • 應用在主線程上進行長時間的計算。
  • 主線程在對另一個進程進行同步 binder 調用,而後者需要很長時間才能返回。
  • 主線程處於阻塞狀態,爲發生在另一個線程上的長操作等待同步的塊。
  • 主線程在進程中或通過 binder 調用與另一個線程之間發生死鎖。主線程不只是在等待長操作執行完畢,而且處於死鎖狀態。
  • GC時間過長等

2.啓用後臺 ANR 對話框
只有在設備的開發者選項中啓用了顯示所有 ANR 時,Android 纔會針對花費過長時間處理廣播消息的應用顯示 ANR 對話框。因此,系統並不會始終向用戶顯示後臺 ANR 對話框,但應用仍可能會遇到性能問題。
3. 啓用嚴格模式在Application中的onCreate中調用

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() //
        .detectAll() 
        .penaltyLog() 
        .penaltyDeath() 
        .build());

4.TraceView
您可以使用 TraceView 在查看用例時獲取正在運行的應用的跟蹤信息,並找出主線程繁忙的位置。
您可以使用設備上的“生成錯誤報告”開發者選項或開發機器上的 adb bugreport 命令,從實體設備獲取錯誤報告。

adb root
adb shell ls /data/anr
adb pull /data/anr/<filename> /Desktop/anr

我們還可以連接設備後直接在Device File Explorer中查看,下圖所示
在這裏插入圖片描述
通過獲取anr下的trace文件名稱或者打開後的頂部會有發生時間,查找ANR發生的大體時間,然後在日誌中查找開頭爲"main"相關的日誌如下圖所示,圖中是我用Xcrash的測試native測試的問題,ANR也是同樣的分析方式都是找main,然後分析下邊的堆棧:

在這裏插入圖片描述

避免ANR問題

儘量避免在主線程(UI線程)中作耗時操作。

Android 官方Anr分析包含Systrace的分析

trace文件中的參數解釋這篇比較好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章