背景:ANR一直以来都是一个比较头疼的问题,当开发中碰到ANR的时候我们该如何分析呢?常规的方案都是去手机的/data/anr目录下拿trace文件,然后再分析trace文件。那问题来了,现在好多研发、测试的开发机都是没有root而且又没有/data/anr目录权限的,在这种情况下我们该怎么定位呢?今天我们就主要聊下这个问题
解决方案:做Android研发的大家应该都知道adb有个命令叫bugreport,至于这个命令是干嘛的大家可以自己去百度去Google,今天主要讲怎么用这个命令去拿到ANR的trace信息。
Step1: 将发生ANR的手机打开"开发者选项"并启动"调试模式"(不会的自行百度)
Step2:将手机连接到电脑上
Step3:在电脑的命令行里面执行命令 "adb bugreport anrlog.zip" (anrlog.zip是生成文件的名字,自己可以随便写),现在命令已经变更成:"adb bugreport > bugreport.txt",这里有个前提是你的电脑装了adb,没装的自行百度如何安装。
Step4:解压生成好的anrlog.zip文件,大概是下图的结构,打开第一个文件,也就是体积最大的那个文件。
Step5:文件打开一看乱七八糟啥都有,其实这就对了,那么我们开始分析这个文件,找出trace信息。
我的经验搜索关键字: "VM TRACES AT LAST ANR",一般就能定位到下图的位置,你看看进程名和时间跟你的进程对上不,对上那就OK了,顺着往下翻就是这次ANR的trace信息了。
还有一个关键字可以用:onAppNotResponding error = Application Not Responding for at least 5000 ms
Step6:至于分析ANR到底是啥原因引起,那就学问大了去了,我一般也就是分析下主线程卡在哪里了,就跟下图一样。如果一眼看不出来,那就继续去搜索前人的经验吧,怎么根据trace信息分析ANR。
如果分析不出来需要查看cpu以及内存的占用信息,"CPU usage from"这个关键字可以搜到anr发生前后cpu的占用情况。