前面已经介绍了 ANR 相关日志的分析。这里我们来看一下,当 ANR 发生的时候,系统调用那些关键的函数代码,来将系统当前的关键信息保存到日志当中。
一、ANR场景
以下常见场景都会触发 ANR 异常。
ServiceTimeout:比如前台服务在 20s 内未执行完成。
BroadcastQueueTimeout:比如前台广播在 10s 内未执行完成。
InputDispatchingTimeout::输入事件分发超时 5s,包括按键和触摸事件。
ServiceTimeout
源码位置:/frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
void serviceTimeout(ProcessRecord proc) {
String anrMessage = null;
synchronized(mAm) {
……
ServiceRecord timeout = null;
long nextTime = 0;
for (int i = psr.numberOfExecutingServices() - 1; i >= 0; i--) {
ServiceRecord sr = psr.getExecutingServiceAt(i);
if (sr.executingStart < maxTime) {
timeout = sr;
break;
}
if