ANR定義
ANR是Application Not Responding的縮寫,指應用無響應。這是Android設計的一種機制,希望我們在其規定時間內完成動作,如果沒有完成,給用戶提示某一過程耗時太長。
ANR產生原因
接着上面所說,系統希望我們在其規定時間內完成動作,也就是它寫入了一些時間配置,超過這個配置的時間就彈出提示框。有以下幾種:
- KeyDispatchTimeout輸入事件(鍵盤輸入KeyEvent和MotionEvent觸摸事件)5s無響應;
- BroadcastTimeout廣播10s無響應;
- ServiceTimeout服務20s無響應;
- ContentProvider超時,不過很少見。
一般情況都是由於我們在主線程做了耗時操作,包括:
- 網絡請求,IO操作,數據庫操作
- 打開wifi(因爲跨進程操作,有可能wifiserver那邊處理超時)
- SharedPreferences的commit操作,但事實證明,頻繁調用apply方法也可能引起ANR.參考剖析 SharedPreference apply 引起的 ANR 問題
- 數據庫查詢語句,在數據庫量巨大時可能產生
- bitmap的處理
- 等等
ANR排查
- BlockCanary
- 追蹤trace.txt文件,一般設備在/data/anr下面,需要root才能adb pull /data/anr/traces.txt D:anr/拉出來;如果沒有就只有使用adb bugreport來生成zip文件,解壓得到trace.txt
- log 查找 搜索 anr 會搜到一段異常信息
ANR處理
核心就是不要在主線程做耗時操作,應當將耗時操作異步執行,即放入其他線程執行。