記一次ANR文件的導出


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      //列出所有文件

當前anr文件列表這時嘗試用命令導出:

 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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM