ANR 学习笔记

接触 ANR 分析一段时间了,但在碰到相关问题的时候,总还是有一种生涩感,专门开篇博客,做一些文章阅读后的笔记吧,不断积累。(友情提示:每个蓝色字的小标题都是一个链接,可以点击跳转到大佬的原文。)

一、理论篇

1 Android ANR 的设计原理

ANR被总结为:埋雷、拆雷、爆雷三个步骤。主要内容是结合源码,分析了 service ANR 的原理,最后的总结我直接复制一下:
1 将要执行的service添加到系统进程的executingServices中。
2 开启检测逻辑,检测将在指定时间后执行,具体时间决定与是前台服务还是后台服务。
3 一旦服务被执行完,就会尝试移除检测逻辑。
4 如果检测逻辑没被移除,就会被执行,然后去检测哪个服务发生了ANR。
5 如果发生了ANR,就将构建ANR信息提供给系统,否则就检测并执行下一轮ANR检测。

二 、实战篇

1 ANR问题该如何分析?

这篇文章极力推荐,虽然是 17 年的,但都是干货啊,想精简一下都难。主要总结了 ANR 日志的分析思路,给的例子也很是经典。

1 ANR 分类

广播ANR
Service ANR
ContentProvider ANR
Input ANR
面向系统:WatchDog
产生ANR原因,如下几种:
耗时操作
自身服务阻塞
系统阻塞
内存紧张
CPU资源抢占

2 分析思路

ANR 问题应该看哪些日志呢?主要是 Trace 日志、log 日志(推荐顺序是 logcat, kernel,cpuinfo 以及 meminfo。

分析 logcat 思路

关键字:anr in,low_memory,slow_operation
anr in 显示故障发生的位置,cpu 使用情况等信息;
low_memory 是低内存相关的打印;
slow_operation 说明系统进程的调度慢。

分析 kernel 思路

关键字:lowmemorykiller
该打印是系统在进行查杀,很频繁的话就有可能是内存低。Free Memory 是空闲物理内存,File Free 是文件 Cache。当 Free 和Other 整体数值都偏低时,Kernel 会进行内存交换,导致整个系统卡顿。

分析 cpuinfo 思路

如果存在占 CPU 明显偏高进程,则 ANR 可能和此进程抢占 CPU 有一定关系;
如果 kswapd,emmc 进程在 top 中,则说明遇到系统内存压力或文件IO开销。

分析 meminfo 思路

看哪类应用或系统占用内存偏高;
如果应用或系统内存使用比较正常,但整体内存偏低,则说明系统中缓存了大量进程,没有及时释放。

3 一些实例

主线程进行耗时操作,或被进程内其它线程阻塞

先观察主线程堆栈,通常会有 blocked 信息,这类问题从堆栈一般能找到原因。
这里列了一个等待其他线程 GC 的例子。学会看WaitingForGcToComplete、WaitingPerformingGc 这一对关键字,GC 时间长的原因从内存使用情况看。

应用内部线程逻辑依赖关系导致超时,触发ANR

这是一个主线程 binder 通信过程中被阻塞的例子。通过看 binder 被调用时的函数名来找到 binder 的对端线程(Binder.java 的下一行),然后看对应线程的状态,后面就是套娃过程,最终找到了一个 binder 参与的死锁链路。

系统内存过低,kernel 进行内存交换过程会引起整个系统运行缓慢

主线程Suspend状态的原因:(1)进程自身过于繁忙,时间片不够用;(2)系统比较繁忙,低优先级得不到时间片。

从堆栈没有明显看到原因,按思路去 logcat 看。
(1) ANR in 。关注了 cpu load 信息(Load: 22.72 / 20.06 / 15.54 /分别对应1分钟/5分钟/15分钟/)、cpu 占比。发现系统负载大(通常 10 左右)、内存偏低。
(2)slow_operation 搜索发现系统函数执行一次花费时间长;
(3)已经怀疑到是内存问题了,所以就直接看 meminfo 了。

Binder 资源耗尽,导致通信请求难以及时响应

这个问题也是堆栈没找到有效信息,去 logcat 找。
根据分析思路的顺序找log,发现内存没有问题。根据 anr 进程本身 cpu 占比高怀疑到 cpu 方向。大佬下面的推测就很灵性了,个人感觉很需要经验。
在这里插入图片描述
找到其他线程后,继续看堆栈,根据最后的调用再回到logcat。

高CPU过度抢占时间片,导致其它应用或任务难以及时调度

主线程多半是处于空闲或Suspend状态.
思路还是我们之前说的那个顺序,在 anr in 的前后根据 pid 去找有效信息。然后是在 trace 和 logcat 间反复。
在这里插入图片描述
日志不全,缺少Trace或其它日志

简而言之,就是按分析log的思路,尽量挖掘有效信息。系统层面无非是 cpu 和 内存两个主要角度。

猜你喜欢

转载自blog.csdn.net/hejnhong/article/details/124369128
ANR