ANR的概念
ANR (Application Not Responding) 應用程序無響應。若是你的應用程序在UI線程被阻塞太長時間就會出現ANR 一般出現ANR,系統會彈出一個提示對話框,讓用戶知道,該程序正在被阻塞,是否等待仍是關閉。linux
ANR的類型
-
KeyDispathTimeout(常見)面試
- input事件在5s內沒有處理完成發生了ANR
- logcat日誌關鍵字:Input event dispatching timed out
注意: input的超時機制和其餘不一樣,對於input來講即便某次事件執行時間超過timeout時長,只要用戶後續沒有再生成輸入事件,就不會觸發ANR數據庫
-
BroadcastTimeOutmarkdown
- 前臺Broadcast: onReceive在10s內沒有處理完成發生ANR。
- 後臺Broadcast: onReceiver在60s內沒有處理完成發生ANR。
- logcat日誌關鍵字: Timeout of broadcast BroadcastRecord
- 根據發送廣播sendBroadcast(Intent intent)中的intent的flags是否包含FLAG_RECEIVER_FOREGROUND來決定把該廣播是放入前臺廣播隊列或者後臺廣播隊列,默認都是後臺廣播
-
ServiceTimeOut網絡
- 前臺Service: onCreate onStart onBind 等生命週期內20s內沒有處理完成發生ANR
- 後臺Service: onCreate onStart onBind 等生命週期內200s內沒有處理完成發生ANR
- logcat日誌關鍵字: Timeout executing service
-
ContentProviderTimeOut多線程
- ConentProvider 在10S內沒有處理完成發生ANR
- logcat日誌關鍵字: timeout publishing content providers
前臺與後臺ANR
決定是前臺或者後臺ANR取決於該應用發生ANR時對用戶是否可感知ide
能夠看到 若是是後臺ANR那麼就直接關閉 若是是前臺ANR就彈出對話框 當前用戶在界面上oop
ANR是怎麼產生的
Service 是在startService中
靜態廣播 超時檢測過程須要檢測SP
動態廣播 靜態廣播沒有正在執行持久化操做的SP任務,則不須要通過 queued-work-looper線程
ContentProvider超時機制
ContentProvider的超時是在ContentProvider進程首次啓動的時候纔會檢測,當ContentProvider進程已啓動的場景,再次請求ContentProvider並不會觸發ContentProvider超時。spa
input超時機制
常見ANR操做
- 主線程進行IO操做好比 操做數據庫 網絡請求 文件操做。 sp文件操做 IO讀寫操做都不在主線程 序列化
- 多線程致使的死鎖,主線程被block.
- 主線程通訊被對端的Binder對端 block住了
- System Server中WatchDog出現ANR
- service binder的鏈接達到上線沒法和System Server通訊
- 系統資源已耗盡(cpu 管道 io)
ANR如何定位分析
線下:anr發生後會有日誌
logcat:會有日誌 會產生 /data/anr/trace_*.txt 文件線程
在Android手機上 沒有root 沒法訪問那麼 /data/anr/trace.txt
那麼咱們可使用adb bugreport anrlog.zip 就能夠了
讀懂trace.txt文件
- 經過logcat日誌,traces文件確認anr發生的時間點
- trace文件和CPU使用率/data/anr/trace_*.txt
- 經過firstPid來查看主線程的狀態
- 其餘線程的狀態
如何監控線上的ANR
- FileObserver:監控某個目錄/文件 狀態發生改變 建立 刪除文件 添加內容
監聽data/anr/目錄是否發生變化 而後上傳data/anr/trace*.txt 可是在 fileoberver 被selinux擋住 5.0以後確定會 系統開發能夠修改 .te配置文件修改
- watchDog來監控方案
繼承Thread向主線程發送一個handler判斷是否
- 線上集成bugly
bugly會集成 手機品牌 型號 配置 大概位置 而後經過money 復現
面試ANR相關問題