Android ANR产生的原因和分析

Android ANR产生的原因和分析

一、什么是ANR:

ANR: ANR全称是Application No Responding,翻译过来就是程序无响应, 他是Android独有的概念。定位和解决以及避免ANR是我们需要必备的技能。

二、ANR产生的原因:

1: ANR产生的原因:
Android的UI线程响应超时就会引起ANR, 主要体现在两种情况中:

1: 当前事件没机会处理,UI线程正在处理其余的事情,当前的事件被其他事件所阻塞
2: 当前事件正在被处理,但是耗时时间太长没有及时完成。在不同组件里面响应的时间也不一样,Activity响应时间为5秒,广播接受者为10秒,服务为20秒

2:典型的ANR场景:

1: 应用程序UI线程存在耗时操作, 如UI线程进行网络请求, 数据库操作或者文件操作, 这些耗时操作的情况都可能会导致UI线程无法及时处理用户的输入,导致ANR产生。
2:UI线程等待子线程释放一个锁,从而无法处理用户的请求输入
3:耗时操作的动画需要大量的计算工作, 导致CPU的负荷很重。

三、ANR的分析过程:

1: 当一个ANR的问题产生, 我们无法确认是ANR watchdog或者是crash。每一种类型的问题的产生都有不同的影响范围和表现形态, 一般冻屏, 一段时间后程序退出, 这种情况的产生都是ANR。在我们的AP Log中,ANR的filter字段一般有这几种: ANR low_memory slow_operation. 我们根据这些关键字搜索到发生ANR的地方:


1_ANR.png

上面的log我们可以定位到产生ANR的具体时间点和应用:
1:ActivityManager( 996): ANR in ... ANR发生在哪个应用
2:PID:8625: 产生ANR应用的线程号
3:ActivityManager( 996): Reason: Input dispatching timed out ANR产生的原因
4:Load: 3.46 / 2.71 / 1.24 CPU前1分钟、5分钟、15分钟的CPU平均负载
5: ActivityManager( 996): CPU usage from 94ms to 643ms later (2000-01-01 00:03:36.926 to 2000-01-01 00:03:37.475): 注意这里是later,代表ANR发生之后,记录的时间是2000-01-01 00:03:36.926 to 2000-01-01 00:03:37.475这个时间间隔之间。
由上面的分析, 我们可以看出来具体的某一个应用因为input dispatching超时产生了ANR。但是这依然看不出具体的原因呀。 这里我们就需要查看ANR log日志了。

2: ANR log日志在系统的data/anr目录下, 我们将所有的anr log日志pull出来。


2_ANR.png

这么多的ANR log日志我们怎么去看 怎么分析呢。
上面的 ActivityManager( 996): CPU usage from 94ms to 643ms later后面这个时间点事关键,查找在对应时间点输出的ANR log日志, 很明显发生ANR的时间在anr_2000-01-01-00-03-37-561这个时间点里面,那么这个文件就是我们需要的文件了

3: 打开这个文件


3_anr.png

1: pid: 8625 对的上
2: cmd line: 包名对得上 check完毕
3: 查看UI线程,搜索main

4_anr.png

1: 主线程 sleeping 阻塞了
2: 可以清晰的看到这个应用在发生ANR的调用栈。这样我们也就定位到具体的问题原因了。
3: 针对具体问题原因来定义解决方案

你可能感兴趣的:(Android ANR产生的原因和分析)