当ANR 发生时,查看系统生成的traces 文件有助于我们定位ANR 产生的原因,那么我们该如何从手机中导出traces 文件呢?可以使用下面的方式
1. 老版本Android 系统导出traces
adb pull data/anr/traces.txt
针对Android 10 以下系统使用上面的命令可以导出traces 文件到运行该命令的当前目录下,如果导出到指定目录,只需在命令后面加上路径和文件名即可,例
adb pull data/anr/traces.txt ~/your path/traces.txt
但是,这个命令在Android 10 及以上是不能导出traces 的,是因为以前ANR 一直放在traces文件中,多次出现有覆盖的问题,高版本系统做了优化,会根据时间戳分别生成一个文件,打包导出。
这个时候,如果运行上面命令,会发现并不能找到traces.txt,如果我们使用adb shell
进入到设备的/data/anr
目录,会发现有一些以时间戳命名的文件,它们其实就是traces 文件,
这时,如果我们使用
adb pull
命令拉取traces 文件的话,会发现并没有权限2. 新版本Android 导出traces
基于上面提到的问题,在新版本Android 中,应该使用如下命令导出traces
adb bugreport
该命令会导出一个zip 压缩包到当前目录(修改路径见上面示例),这个压缩包中包括了一些bug 信息,而traces 文件则包含在压缩包的FS/data/anr
路径下
上面也曾提到,新系统对traces 文件生成做了优化,多次ANR 会根据其发生的时间戳来命名,这样的话就可能会有多个traces 文件,那么哪个才是我们需要看的呢?
3. 找到目标traces
我们首先打开压缩包最外层目录下的bugreport-***.txt
搜索anr in
关键字,然后在搜索到的结果匹配我们应用的application id,然后向上滑动,找到 Dumping to /data/anr/filename
这一行,其中filename 就是traces 文件名。