㈠ android 閃退日誌
先清除之前的日誌:adb logcat -c
操作閃退步驟後,輸出干凈消槐的閃退日誌:adb logcat -b crash >error.txt
adb bugreport > log.txt
搜索fatal exception 或者crash;
app出現anr時會在data/anr目錄下生成traces.txt文件
adb pull data/anr/traces.txt > anr_log.txt
traces.txt文件里存放設備所有app的anr日誌
打開日誌文件,搜索包名
查看手機的所有拿激友日誌
adb logcat
只獲取該應用的日誌
adb logcat | findstr 應用包名
開始抓取日誌並保存到D盤的crash.txt
adb logcat >D:\crash.txt
ctrl +C 停止抓取
ctrl +F 搜索 force finishing查看閃鉛槐退的日誌
https://blog.csdn.net/lan_yangbi/article/details/112031488
㈡ Android 通過logcat查看crash 或者anr日誌
在Android APP的測試過程中經常遇到crash和anr,開發人員習慣通過eclipse或者eclipse的ddms組件進行捕抓日誌,測試人員常通過在dos窗口下adb命令的方式來抓取日誌。前者的缺點是啟動時非常耗時,後者呢則每孝尺次都要寫命令也比較麻煩(需要截圖時也存在這個問題唯銀)。
crash可以在日誌巧山高中搜:FATAL 關鍵詞
anr搜:anr in關鍵詞
㈢ android開發怎樣查看app的anr日誌
一:什麼是ANR
ANR:Application Not Responding,即應用無響應
二:ANR的類型
ANR一般有三種類型:
1:KeyDispatchTimeout(5 seconds) --主要類型
按鍵或觸摸事件在特定時間內無響應
2:BroadcastTimeout(10 seconds)
BroadcastReceiver在特定時間內無法處理完成
3:ServiceTimeout(20 seconds) --小概率類型
Service在特定的時間內無法處理完成
三:KeyDispatchTimeout
Akey or touch event was not dispatched within the specified time(按鍵或觸摸事件在特定時間內無響應)
具體的超時時間的定義在framework下的
ActivityManagerService.Java
//How long we wait until we timeout on key dispatching.
staticfinal int KEY_DISPATCHING_TIMEOUT = 5*1000
四:為什麼會超時呢?
超時時間的計數一般是從按鍵分發給app開始。超時的原因一般有兩種:
(1)當前的事件沒有機會得到處理(即UI線程正在處理前一個事件,沒有及時的完成或者looper被某種原因阻塞住了)
(2)當前的事件正在處理,但沒有及時完成
五:如何避免KeyDispatchTimeout
1:UI線程盡量只做跟UI相關的工作
2:耗時的工作(比如資料庫操作,I/O,連接網路或者別的有可能阻礙UI線程的操作)把它放入單獨的線程處理
3:盡量用Handler來處理UIthread和別的thread之間的交互
㈣ Android ANR 機制
廣播的 ANR 處理相對簡單,主要是再次判斷是否超時、記錄日誌,記錄 ANR 次數等。然後就繼續調用 processNextBroadcast 函數,處理下一條廣播了。
ContentProvider 超時為 CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10s
Activity 的 ANR 是相對最復雜的,也只有 Activity 中出現的 ANR 會彈出 ANR 提示框。
最終的表現形式是:彈出一個對話框,告訴用戶當前某個程序無響應,輸入一大堆與 ANR 相關的日誌,便於開發者解決問題。
InputDispatching:
Activity 最主要的功能之一是交互,為了方便交互,Android 中的 InputDispatcher 會發出操作事件,最終在 InputManagerService 中發出事件,通過 InputChannel,向 Activity 分發事件。交互事件必須得到響應,如果不能及時處理,IMS 就會報出 ANR,交給 AMS 去彈出 ANR 提示框。
KeyDispatching:
如果輸入是個 Key 事件,會從 IMS 進入 ActivityRecord.Token.keyDispatchingTimeOut,然後進入 AMS 處理,不同的是,在 ActivityRecord 中,會先截留一次 Key 的不響應,只有當 Key 連續第二次處理超時,才會彈出 ANR 提示框。
窗口焦點:
Activity 總是需要有一個當前窗口來響應事件的,但如果遲遲沒有當前窗口(獲得焦點),比如在 Activity 切換時,舊 Activity 已經 onPause,新的 Activity 一直沒有 onResume,持續超過 5 秒,就會 ANR。
App 的生命周期太慢,或 CPU 資源不足,或 WMS 異常,都可能導致窗口焦點。
1. 判斷是否有 focused 組件以及 focused Application:
這種一般是在應用啟動時觸發,比如啟動時間過長在這過程中觸發了 keyevent 或者 trackball moteionevent 就會出現。
對應於
2. 判斷前面的事件是否及時完成:
對應於
出現這種問題意味著主線程正在執行其他的事件但是比較耗時導致輸入事件無法及時處理。
InputDispatcher 超時是最常見的 ANR 類型,而且其類型也比較多。
當用戶觸摸屏幕或者按鍵操作,首次觸發的是硬體驅動,驅動收到事件後,將該相應事件寫入到輸入設備節點, 這便產生了最原生態的內核事件。接著,輸入系統取出原生態的事件,經過層層封裝後成為 KeyEvent 或者 MotionEvent ;最後,交付給相應的目標窗口(Window)來消費該輸入事件。可見,輸入系統在整個過程起到承上啟下的銜接作用。
Input 模塊的主要組成:
每一個應用進程都會有一個 SignalCatcher 線程,專門處理 SIGQUIT,來到 art/runtime/signal_catcher.cc :
當應用發生 ANR 之後,系統會收集許多進程,來 mp 堆棧,從而生成 ANR Trace 文件。收集的第一個,也是一定會被收集到的進程,就是發生 ANR 的進程。接著系統開始向這些應用進程發送 SIGQUIT 信號,應用進程收到 SIGQUIT 後開始 mp 堆棧。
[1] developer ANRs
[2] Android ANR 分析詳解
[3] 看完這篇 Android ANR 分析,就可以和面試官裝逼了!
[4] 微信 Android 團隊手把手教你高效監控 ANR
[5] Input 系統—ANR 原理分析 - Gityuan
[6] 徹底理解安卓應用無響應機制 - Gityuan
[7] 理解 Android ANR 的觸發原理 - Gityuan