1. 程式人生 > >Android ANR 問題第一彈

Android ANR 問題第一彈

日常開發測試中,我們經常會遇到各種應用的ANR問題,什麼是ANR?application not respond,說的就是你的應用無響應了,卡了
廢話不多說,直接上乾貨
一:Android ANR 分三類
Input dispatch(系統的key,螢幕點選事件)處理超時 ANR timeout 5000ms
BroadcastReceiver 分發+處理超時ANR(廣播超時一般指的都是有序廣播即ordered型別的廣播超時)
    前臺廣播(加了FLAG_RECEIVER_FOREGROUND)timeout 10000ms
    後臺廣播 timeout 60000ms
Service 啟動+執行超時 ANR
    前臺服務 timeout 20000ms
    後臺服務 timeout 200000ms

二:分析處理ANR問題
搜尋關鍵Log:am_anr,InputDispatcher
am_anr(通用的ANR第一時間點的Log,Input超時的時候有可能會有延遲),InputDispatcher(當有Input超時的時後,該Log列印時間點是ANR第一發生的時間點),
am_anr log都是由 (User|1|5),(pid|1|5),(Package Name|3),(Flags|1|5),(reason|3)組成的,我們根據reason去分類ANR型別,
然後根據不同的型別從am_anr開始點,往回看相應的timeout時間的Log,大致看一下timeout時間內,我們的應用,或者系統都在做什麼。

trace檔案一般存在data\anr目錄,可以匯出看一下,ANR發生時應用各個執行緒的呼叫堆疊資訊,trace檔案也是分析ANR問題的關鍵,但並不一定是絕對的準確,trace檔案只是收集ANR發生時的某一時刻
的呼叫堆疊資訊。某一時刻請自行體會,多看一點ANR問題,便能體會。

三:ANR問題發生常見原因
原因無非兩種,要麼應用自身原因,要麼系統原因
自身原因:
Input dispatch timeout :一般是你的UI主執行緒做了耗時的操作,請注意Handler(非同步處理操作,操作仍在UI主執行緒因為使用的是主執行緒的loop和messagequeue),HandlerThread的使用(真正的非同步執行緒操作),
BroadcastReceiver timeout: 一般是你的onReceiver執行時間過長
Service timeout: 很少遇到

系統原因:
主要RAM不足,或者CPU資源不足導致的,需要系統優化自己的效能,
一般會有lowmemorykill的log等等