1.老版Android系統 anr的導出
在項目目錄下或app下運行命令:
adb pull data/anr/traces.txt
測試了華為p7(Android 5.1.1)和榮耀v10(Android 9),發現都能正常導出。但是遇到華為mate10、mate10 pro 一直都導出失敗。
adb: error: failed to stat remote object 'data/anr/traces.txt': No such file or directory
查了些資料,發現廠商有對這塊做優化。以前anr一直放在traces文件中,多次出現有覆蓋的問題。高版本廠商做了優化,會根據時間戳分別生成一個文件,打包導出。
2.高版本導出方案
1.查看是否存在traces。
adb shell
cd data/anr
ls -a //列出所有文件
這時嘗試用命令導出:
D:\code\githup\AndroidReView\app>adb pull data/anr/anr_2019-01-30-13-35-18-005
adb: error: failed to copy 'data/anr/anr_2019-01-30-13-35-18-005' to '.\anr_2019-01-30-13-35-18-005': remote open failed: Permission denied
提示權限拒絕,我們無法想之前一樣導出anr目錄下某個文件。
解決方案:
adb bugreport

此命令會導出一個zip壓縮包,解壓后在FS/data/anr目錄下就可以看到traces文件了。
- adb bugreport 命令也可以指定文件導出目錄,如導出到桌面:adb bugreport C:\Users\Nxin\Desktop ;不指定時會在當前命令行對應目錄下導出壓縮包。
3.ANR的緣由
產生anr的情況有:
(1)Activity按鍵或觸摸事件在特定時間內無響應(5s)
(2)Service在特定時間內無法處理完成(20s)
(3)BroadcastReceiver在特定時間內無法處理完成(10s)
開發中主要多發在第一種情況,在主線程做了耗時操作,導致堵塞,然后觸發點擊事件,無法及時響應,開發中復雜的業務可以轉到子線程去實現,主線程盡量做UI操作。
提供一個anr的調試代碼:
@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.btn_one) {
L.i(initTag(), "開始阻塞主線程");
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
L.i(initTag(), "結束阻塞主線程");
} else if (i == R.id.btn_two) {
L.i(initTag(), "點擊第二個按鈕");
}
}
點擊第一個按鈕后,立刻多次觸發第二個按鈕,就會有anr了。
轉載:https://blog.csdn.net/denglusha737/article/details/86706909
