如何进行ANR简述


如何进行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简述问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注开发云行业资讯频道了解更多相关知识。

相关推荐: SublimeText3配置react语法校验的示例

小编给大家分享一下SublimeText3配置react语法校验的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SublimeText3是一款跨平台代码编辑器软件,Sublime…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/13 16:39
下一篇 05/13 16:40