當ANR 發(fā)生時烂翰,查看系統(tǒng)生成的traces 文件有助于我們定位ANR 產(chǎn)生的原因烦粒,那么我們該如何從手機中導(dǎo)出traces 文件呢休溶?可以使用下面的方式
1. 老版本Android 系統(tǒng)導(dǎo)出traces
adb pull data/anr/traces.txt
針對Android 10 以下系統(tǒng)使用上面的命令可以導(dǎo)出traces 文件到運行該命令的當前目錄下代赁,如果導(dǎo)出到指定目錄,只需在命令后面加上路徑和文件名即可兽掰,例
adb pull data/anr/traces.txt ~/your path/traces.txt
但是芭碍,這個命令在Android 10 及以上是不能導(dǎo)出traces 的,是因為以前ANR 一直放在traces文件中孽尽,多次出現(xiàn)有覆蓋的問題窖壕,高版本系統(tǒng)做了優(yōu)化,會根據(jù)時間戳分別生成一個文件杉女,打包導(dǎo)出艇拍。
這個時候,如果運行上面命令宠纯,會發(fā)現(xiàn)并不能找到traces.txt,如果我們使用adb shell
進入到設(shè)備的/data/anr
目錄层释,會發(fā)現(xiàn)有一些以時間戳命名的文件婆瓜,它們其實就是traces 文件,
這時贡羔,如果我們使用
adb pull
命令拉取traces 文件的話廉白,會發(fā)現(xiàn)并沒有權(quán)限2. 新版本Android 導(dǎo)出traces
基于上面提到的問題,在新版本Android 中乖寒,應(yīng)該使用如下命令導(dǎo)出traces
adb bugreport
該命令會導(dǎo)出一個zip 壓縮包到當前目錄(修改路徑見上面示例)猴蹂,這個壓縮包中包括了一些bug 信息,而traces 文件則包含在壓縮包的FS/data/anr
路徑下
上面也曾提到楣嘁,新系統(tǒng)對traces 文件生成做了優(yōu)化磅轻,多次ANR 會根據(jù)其發(fā)生的時間戳來命名,這樣的話就可能會有多個traces 文件逐虚,那么哪個才是我們需要看的呢聋溜?
3. 找到目標traces
我們首先打開壓縮包最外層目錄下的bugreport-***.txt
搜索anr in
關(guān)鍵字,然后在搜索到的結(jié)果匹配我們應(yīng)用的application id叭爱,然后向上滑動撮躁,找到 Dumping to /data/anr/filename
這一行,其中filename 就是traces 文件名买雾。