当我们的应用遇到ANR时,可能会想到的办法是去看data/data/anr目录的trace.txt文件,如下图所示:
然后打开根据log中的trace信息去定位,大概的文本结构结构如下:
ANR in com.example.catchanrlog (com.example.catchanrlog/com.example.anr_monitor.SecondActivity)
PID: 17267
Reason: Input dispatching timed out (AppWindowToken{1d36b86 token=Token{6b1461 ActivityRecord{a84bbc8 u0 com.example.catchanrlog/com.example.anr_monitor.SecondActivity t832}}}, Waiting because no window has focus but there is a focused application that may eventually add a window when it finishes starting up.)
Dump time: 2022-02-28 00:33:11.956 GMT+08:00
Package: com.example.catchanrlog
Current looper: Looper (main, tid 2) {44f9de7}
Current running message:
seq=32 plan=00:32:59.002 late=216ms h=android.app.ActivityThread$H w=159
History of long time messages on Looper (main, tid 2) {44f9de7}:
Msg #1: seq=28 plan=00:32:58.993 late=11ms wall=211ms running=1ms h=android.view.ViewRootImpl$ViewRootHandler c=android.view.View$PerformClick
Msg #2: seq=25 plan=00:32:58.759 late=1ms wall=231ms running=10ms runnable=8ms h=android.view.ViewRootImpl$ViewRootHandler c=android.view.View$PerformClick
Msg #3: seq=3 plan=00:32:39.755 late=126ms wall=175ms running=154ms runnable=5ms h=android.app.ActivityThread$H w=159
Msg #4: seq=2 plan=00:32:39.689 late=0ms wall=192ms running=177ms runnable=3ms h=android.app.ActivityThread$H w=110
(dump anr info success and took 7ms)
但是问题来了,ANR的trace.txt文件在高版本设备上是没有权限获取的,我这边的截图虽然是Anroid9,理应没有权限才对,是因为是装的开发版的系统,获取了ROOT权限,所以可以直接查看,正常的设备是没有权限查看的。因此bugreport工具就能解决这样的问题。
官方文档:https://developer.android.com/studio/debug/bug-report
获取bugreport报告:
adb bugreport
运行上面的adb命令后会生成一个命名为 bugreport-BUILD_ID-DATE.zip的压缩包文件,上面是没在bugreport命令后加上存储路径,会自动保存在设备内部存储的bugports文件夹下:
这个时候的压缩包实际上是记录了很多个子文件,我们可以在里面找到我们需要的比如anr的trace.txt文件:
打开后看看内容,发现其实就是我们平时需要的anr的log文件,内容是一样。