一、ANR 的定义
ANR 全称 Application Not Responding,意思就是应用程序无响应

二、ANR 产生的原因

1、当前事件没有得到处理,比如 UI 线程正在响应另一事件,当前事件由于某种原因被阻塞了

2、当前的事件正在被处理,但是由于耗时太长没有能够及时完成

三、ANR 产生的本质原因

1、keydispatchtimeout:最常见的一种类型,原因是 view 事件或者触摸事件在 5 秒内未得到及时响应

2、broadcasttimeout:BroadcastReceiver 的 onReceive 函数运行在主线程,并在特定的时间内(10s)无法完成处理

3、servicetimeout:Service 的各个生命周期函数在特定时间内(20s)无法完成响应

四、典型 ANR 场景

1、主线程频繁进行 IO 操作,比如读写文件或者数据库

2、硬件操作如进行调用照相机或者录音等操作

3、多线程操作的死锁,导致主线程等待超时

4、主线程调用 join() 方法、sleep() 方法或者 wait() 方法

5、耗时动画/耗资源行为导致 CPU 负载过重

6、system server 中发生 WatchDog ANR

7、service binader 的数量到达了上限

五、Thread 说明

六、分析思路

1、logcat 抓取日志命令:adb logcat -v time > C:/Users/dd/Desktop/logcat.log

(1)从 logcat 分析:查询关键字:ANR/ANR in com.xxx.xxx

(2)关键字所展示的内容:

2、从 trace.txt 文件分析

(1)使用命令获取 trace 文件:adb pull /data/anr/trace.txt

(2)在 trace.txt 文件中可以查看到以下信息:

(3)主线程日志分析

由于 ANR 只会发生在主线程,主线程的状态也是需要关注的。


↙↙↙阅读原文可查看相关链接,并与作者交流