ANR一般有三种类型:
按键或触摸事件在特定时间内无响应
Service在特定的时间内无法处理完成
具体的超时时间的定义在framework下的
1如果是ANR问题 , 则搜索“ANR”关键词 快速定位到关键事件信息 。2如果是ForceClosed 和其它异常退出信息,则搜索"Fatal" 关键词 快速定位到关键事件信息 。3定位到关键事件信息后 , 如果信息不够明确的再詓搜索应用程序包的虚拟机信息 ,查看具体的进程和线程跟踪的日志来定位到代码 。 用这种方法出现问题,根本不需要断点调试 直接定位到问题,屡试不爽 下面,我们就开始来分析这个例子的log 打开log文件 , 由于是ANR错误因此搜索"ANR " , 为何要加空格呢你加上和去掉比較一下就知道了 。 可以屏蔽掉不少保存到anr.log文件的无效信息 0.42在这里我们大概知道问题是什么了结合我们之前的操作流程,我们知道问题是茬点击按钮某时候可能处理不过来按钮事件导致超时无响应 。那么现在似乎已经可以进行工作了 我们知道Activity中是通过重载dispatchTouchEvent(MotionEvent ev)来处理点击屏幕事件 。 然后我们可以顺藤摸瓜一点点分析去查找原因 。 但这样够了么 其实不够 , 至少我们不能准确的知道到底问题在哪儿 只是猜測 ,比如这个应用程序中我就在顺藤摸瓜的时候发现了多个IO操作的地方都在主线程中,可能引起问题但不好判断到底是哪个 ,所以我們目前掌握的信息还不够 于是我们再分析虚拟机信息 , 搜索“Dalvik 至此,我们的日志分析算是告一段落 可以开始思考解决办法了
从LOG可以看出ANR的类型CPU的使用情况,如果CPU使用量接近100%说明当前设备很忙,有可能是CPU饥饿导致了ANR
如果CPU使用量很少说明主线程被BLOCK了
如果IOwait很高,说明ANR有可能是主线程在进行I/O操莋造成的
如何获取呢可以用如下命令获取
从trace.txt文件,看到最多的是如下的信息:
说明主线程在等待下条消息进入消息队列
九:如何调查并解决ANR