1.logcat日志文件
>android日志系統提供了記錄和查看系統調試信息的功能,日志都是從各種軟件和一些系統的緩沖區中記錄下來的,緩沖區可以通過logcat命令來查看和使用
使用方式:
adb logcat [<option>]...[<filter-spec>]..
>logcat是以如下開頭的:
---------beginning of xxx
>開發者選項,有個叫做“日志記錄器緩沖區大小”,默認是256k,日志是循環寫入環形緩沖區的,通常情況下,寫滿時最舊的日志會被刪除以給新輸出的日志留內存空間
2.log緩沖區
android log輸出量巨大,特別是通信系統的log,因此android把log輸出到不同的緩沖區。
目前定義了四個log緩沖區:
Radio:輸出通信系統的log 如,nfc、3G/4G 藍牙、wifi等
System:輸出系統組件的log 如,調用攝像頭等
Events:輸出event模塊的log 如,觸摸事件、按鍵事件
Main:輸出java層的log(不屬於上面三層的log),測試app過程着重關注Main模塊
注意:
默認輸出Main緩沖區log,如想輸出通信系統的log:
adb logcat -b radio > D:\test\log_radio.txt -- 重定向輸出日志
3.logcat日志文件分析
輸出的日志格式如下:
3.1由5部分組成:
>寫下日志時的時間
日志中添加時間:adb logcat -v time > D:\test\log.txt
>優先級,在Android中,日志的優先級從低到高分以下幾種:
V--verbose(啰嗦,最低級別,開發調試中的一些詳細信息,僅在開發中使用,不可在發布產品時使用)
D--Debug(調試,用於調試的信息,可以在發布產品中關閉,比較常見)
I--Info(信息,一般提示性的消息)
W--Warning(警告)
E--Error(錯誤,已經出現可影響運行的錯誤,比如應用crash時輸出的日志)
>標簽(tag),標明日志發起者和方便日志的過濾篩選,如上中的ActivityManger,開發自己定義的,方便查找
> PID(進程ID),如上中的491
>正文,本日志的主體內容
3.2 crash崩潰
>現象:提示xx停止運行
>如何在日志中檢索?
出現崩潰后,輸出最新日志,搜索 FATAL EXCEPTION關鍵字(代表嚴重錯誤)、crash關鍵字 ,然后將找到的E級別日志(方法調用棧)全部提交給到開發
3.3ANR無響應
>現象:當操作在一段時間內系統無法處理時,系統層面會彈出下圖那樣的ANR對話框
>為用戶在主線程長時間被阻塞時提供處理交互,提高用戶體驗
>Android系統一種自身檢測機制
>如何在日志中檢索?
出現ANR后,輸出最新日志,搜索ANR in 關鍵字,但是根據E級別日志開發往往不能定位ANR問題,需要找到上圖紅框中標出的traces.txt文件,從而找到方法調用棧,使得開發能夠定位問題
>>如何找到traces.txt?
adb shell
cd /data/anr
ls
找到traces.txt 文件,exit
拉取到本地:adb pull /data/anr/traces.txt D:\test
注意:
traces.txt時間和緩沖區日志時間會有差異(幾秒),因為屬於兩個不同的模塊,系統不會同步寫
traces.txt只能保留最近一次的anr信息
>解決只能保留最近一次的anr信息的方法,dropbox :
adb shell
依次找到 /data/system/dropbox 目錄,如圖:
data_app開頭的是第三方手動安裝的應用異常信息,然后就可以把/data/system/dropbox目錄拉取出來然后給到開發人員
===============================================
需要說明的是:
>安卓手機碎片化嚴重,不能保證每台手機都有Dropbox
>不是所有手機都是root權限
上述兩種情況下:
其實直接把traces.txt 文件拉取出來就好:adb pull /data/anr/traces.txt D:\test
說到底,如果app出現問題的話logcat系統級別的日志(adb logcat -v time > D:\test\log.txt ) 會體現出來,除非開發做了異常捕獲,那就需要問開發是不是做了異常捕獲,捕獲到了哪里~