ANR简述

ANR简述以及分析流程

ANR简介

什么是ANR?ANR即为Application Not Responding,也就是应用程序无响应。

ANR的原因

Android系统中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会检测App的响应时间,如果App在特定时间无法相应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。
产生ANR的原因一般有以下三种:
1.点击、触摸、键盘输入事件在5s内没有及时响应(inputdispatch timeout)
2.广播超时没有响应,前台广播10s未响应,后台广播60s未响应 (Broadcast timeout)
3.service 20s 没有响应 (service timeout)

ANR的分析流程

现在我们通过一个分析实例来进行阐述,如何分析anr 的问题

1.首先我们要先分析一个anr的systemlog
通过搜索关键字“anr ”可以定位到在log中anr 发生的地方,如下图
ANR简述

从systemlog中这段log,我们可以知道几个关键的点
1.anr发生的进程名、进程号(PID: 1531)
2.anr发生的原因(如上点击事件超时未响应)
3.anr发生的时候,当时的进程cpu占用情况,同时具体进程占用的上层和kernel层资源情况。

2.通过上一步的大致描述,找到anr发生的时间点
上面可以看到anr是因为点击事件超时没有响应,导致的anr,那么我们可以在这个时间点的前5s(个别定制化平台可能时间不为5s),查看具体发生anr的进程(Pid 1531)在做什么。
ANR简述

在systemlog中查看到具体anr发生的时间点,以便我们了解该时间点的时候,系统进程在进行什么操作,同时,可以简单看下我们的具体进程在进行什么操作

3.查找trcace文件,查看进程的堆栈(最重要的一步)
ANR简述
从这个截图来看,我们首先找到pid 为1531的进程main进程,查看当时main进程卡死在什么地方。
从状态native来看,是进程卡在了native层没有及时返回,从堆栈来看进程是在操作imagePlayerManager.init
的时候,进行进程间通信,在native层卡主没有及时返回。
所以此时要找到对应堆栈在代码中的位置,查看具体耗时操作。查看卡主未返回的具体原因。
在耗时操作位置做规避来防止anr的发生。

总结

导致ANR的情况还有很多,进程死循环、死锁、耗时操作(网络请求,图片处理,数据库处理等)卡死主线程。
后续找到经典案例继续补充。
分析ANR需要trace文件这个是非常重要的一点。

猜你喜欢

转载自blog.51cto.com/14353120/2399035
ANR
今日推荐