深入了解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捕捉

posted @ 2017-05-25 15:37  ha_cjy  阅读(4298)  评论(0编辑  收藏  举报