背景:APP最近需要發新版本,提給測試部測試後,測試部發現了一個bug,APP放置在後台,手機息屏放置一段時間後,這個時間無法確定,測試部的人是放置一晚上,作為測試條件,發現確實存在這個問題
原因分析:拿到手機後,打開應用,發現App可以打開,但是,無法進行任何操作,只能打開手機應用後台,關閉App進程,重新打開App,App恢復正常,一開始的判斷是App內存優化不足夠,導致的內存爆了,後來仔細分析並網上查詢以後,確定是App出現ANR導致的問題
ANR導致的原因(網上搜索以後自行覺得的重點):
- InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
- BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的
onReceive()
函数时10秒没有处理完成,后台为60秒。 - Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。
- ContentProvider Timeout :ContentProvider的publish在10s内没进行完。
我APP出現的原因是:BroadcastQueue Timeout,onReceived()的時候出現的ANR;
PS:我是通過導致了ANR報告以後確認了這個問題
下面我會開始介紹用網上找到的導出ANR,traces文件的具體流程,我的電腦是MAC電腦,如果是Windows玩家,請自行根據下面的流程找到對應在Windows上的指令。PS:Mac真方便
推薦閱讀:https://www.jianshu.com/p/388166988cef,這個大佬的文章,讓我豁然開朗
下面我介紹導出traces的步驟:
進入終端:
輸入:adb shell
cd data/anr
ls
這樣就可以查看到當前手機出現過的ANR,手機系統生成的報告目錄
traces.txt文件的文件名一般是:anr_2020-06-30-16-58-16-171
這個就是我們需要拿出來的文件,當你確認你找到了你出現ANR的文件,就可以導出來
這個時候再終端上輸入:exit(退出shell)
在Android7.0以前的手機一般可以直接pull出具體的文件
終端指令:adb pull data/anr/anr_2020-06-30-16-58-16-171
這樣文件就會出現在當前mac用戶文件夾下
而在Android系統等級更高的手機,如果你輸入該指令,可能會提示:
adb: error: failed to copy 'data/anr/anr_2020-06-30-16-58-16-171' to './anr/anr_2020-06-30-16-58-16-171': remote open failed: Permission denied
地址:./anr/anr_2020-06-30-16-58-16-171 ,在mac上的意思就是:/Users/當前用戶/anr/文件
這裡就可以找到你的文件
當出現該問題時,只需要輸入:adb bugreport
等待進度條完成,就可以查看到對應的anr日誌
anr內容的分析,我就不在這裡累述,本人水平也有限,無法表達清楚,希望該文章能給你幫助