深入了解ANR


一、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之間的聯系等。

 

參考鏈接:

ANR介紹 ANR分析ANR案例分析 ANR捕捉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM