ANR 之 traces.txt 文件分析
2018-12-04 本文已影响3人
BugFree张瑞
参考文献:
https://www.jianshu.com/p/8964812972be
https://blog.csdn.net/tjy1985/article/details/6777355
http://haiolv.github.io/2016/06/13/android-anr%E5%88%86%E6%9E%90/
ANR 一般有三种类型:
-
KeyDispatchTimeout(5 seconds) –主要类型按键或触摸事件在特定时间内无响应
-
BroadcastTimeout(10 seconds) – BroadcastReceiver 在特定时间内无法处理完成
-
ServiceTimeout(20 seconds) –小概率类型 Service 在特定的时间内无法处理完成
// How long we wait until we timeout on key dispatching.
static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
引起ANR问题的根本原因,总的来说可以归纳为两类:
- 应用进程自身引起的,例如:主线程阻塞、挂起、死循环;应用进程的其他线程的 CPU 占用率高,使得主线程无法抢占到 CPU 时间片。当用户的输入事件( Input Event,如按键或触摸)在5秒内得不到响应 或者 BroadcastReceiver 在 10秒内未做完,就会引发 ANR;
- 其他进程间接引起的,例如:当前应用进程进行进程间通信请求其他进程,其他进程的操作长时间没有反馈;其他进程的 CPU 占用率高,使得当前应用进程无法抢占到 CPU 时间片
com.qihoo.browser 进程处理 SIGNAL_QUIT signal, 并把 ANR 信息写入 traces.txt 文件。进程的虚拟机实例接收到 SIGNAL_QUIT 信号后会由 "Signal Catcher" 线程将进程中各个线程的函数堆栈信息输出到 traces.txt 文件中。值得注意的是, 当前运行的其他进程也会把当前的函数堆栈信息输出到 traces.txt 文件中,但发生 ANR 的进程正常情况下会第一个输出,所以一般情况下我们只看 traces.txt 的开头就行了。
framework 是如何输出 ANR 信息到 traces.txt 文件中去的?
ActivityManagerService.java 中的 appNotResponding() 方法: