一、ANR介紹
ANR ,是Application not responding,就是應用無響應的意思。這也是Android應用崩潰的三大崩潰之一。另外2個是RuntimeException和native信號異常。今天我們主要是分析ANR。
一般來說,出現ANR的場景有以下幾種:
1)KeyDispatchTimeout:按鍵或者觸摸事件在5秒內沒有處理完成;
2)ServiceTimeout:service執行超時,前台10s,后台20s;
3)BroadcastTimeout:廣播處理超時,前台10s,后台60s;
4)ContentProvider在20s內沒有執行完成。
造成ANR的原因常見的有:
1、在主線程進行耗時操作如IO操作、數據庫操作、連接網絡等;
2、被子線程同步鎖;
3、Binder被占滿導致主線程不能和SystemServer通信;
4、得不到系統資源等。
二、分析ANR
一般出現ANR,我們在Logcat是看不到異常信息的。那我們要如何查看呢?我們在logcat中總會看到這樣的日志:
I/art: Thread[2,tid=25238,WaitingInMainSignalCatcherLoop,Thread*=0xafa0e400,peer=0x12c2a080,"Signal Catcher"]: reacting to signal 3 I/art: Wrote stack traces to '/data/anr/traces.txt'
traces文件會記錄異常位置、CPU和內存在當時的使用情況,我們可以通過命令打開該文件。
1、adb shell 2、cat /data/anr/traces.txt
三、避免ANR
1)在主線程中避免耗時操作,如復雜的Layout,io操作,數據庫操作,網絡連接等;
2)子線程中不要做跟UI相關的操作;
3)盡量使用Hanlder來處理Thread和UI之間的聯系等。
參考鏈接: