如何进行ANR简述,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
什么是ANR?ANR即为Application Not Responding,也就是应用程序无响应。
Android系统中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会检测App的响应时间,如果App在特定时间无法相应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。
产生ANR的原因一般有以下三种:
1.点击、触摸、键盘输入事件在5s内没有及时响应(inputdispatch timeout)
2.广播超时没有响应,前台广播10s未响应,后台广播60s未响应 (Broadcast timeout)
3.service 20s 没有响应 (service timeout)
现在我们通过一个分析实例来进行阐述,如何分析anr 的问题
1.首先我们要先分析一个anr的systemlog
通过搜索关键字“anr ”可以定位到在log中anr 发生的地方,如下图
从systemlog中这段log,我们可以知道几个关键的点
1.anr发生的进程名、进程号(PID: 1531)
2.anr发生的原因(如上点击事件超时未响应)
3.anr发生的时候,当时的进程cpu占用情况,同时具体进程占用的上层和kernel层资源情况。
2.通过上一步的大致描述,找到anr发生的时间点
上面可以看到anr是因为点击事件超时没有响应,导致的anr,那么我们可以在这个时间点的前5s(个别定制化平台可能时间不为5s),查看具体发生anr的进程(Pid 1531)在做什么。
在systemlog中查看到具体anr发生的时间点,以便我们了解该时间点的时候,系统进程在进行什么操作,同时,可以简单看下我们的具体进程在进行什么操作
3.查找trcace文件,查看进程的堆栈(最重要的一步)
从这个截图来看,我们首先找到pid 为1531的进程main进程,查看当时main进程卡死在什么地方。
从状态native来看,是进程卡在了native层没有及时返回,从堆栈来看进程是在操作imagePlayerManager.init
的时候,进行进程间通信,在native层卡主没有及时返回。
所以此时要找到对应堆栈在代码中的位置,查看具体耗时操作。查看卡主未返回的具体原因。
在耗时操作位置做规避来防止anr的发生。
导致ANR的情况还有很多,进程死循环、死锁、耗时操作(网络请求,图片处理,数据库处理等)卡死主线程。
后续找到经典案例继续补充。
分析ANR需要trace文件这个是非常重要的一点。
关于如何进行ANR简述问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。