ANR 之 traces.txt 文件分析

参考文献:

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 一般有三种类型:

  1. KeyDispatchTimeout(5 seconds) –主要类型按键或触摸事件在特定时间内无响应

  2. BroadcastTimeout(10 seconds) – BroadcastReceiver 在特定时间内无法处理完成

  3. 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() 方法:

    原文作者:BugFree张瑞
    原文地址: https://www.jianshu.com/p/4b514000cb5c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞