深入了解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之间的联系等。
参考链接: