簡介
ADB,即 Android Debug Bridge,它是 Android 開發/測試人員不可替代的強大工具。
對于開發人員來說,Android Studio已經提供了強大的日志查看,過濾等功能。那為什么我們還要了解logcat這個命令呢?
在有些情況下,電腦沒有安裝開發工具,或者調試一些小問題的時候,我們只需要查看一條簡單的日志就能夠確定問題所在,那么這個時候,使用logcat會節省很多時間。
在比如,測試一般不會安裝Android開發工具,如果不了解logcat,就很難快速定位問題,對于有些功能不能做更加精確的測試。
參考
日志工具
- Android Studio
Android開發工具,自帶強大的日志查看工具。 - DDMS
Android SDK下tools文件夾下的一個工具,不需要安裝Android Studio,但是需要安裝Java Sdk,DDMS同樣具備強大的日志等功能,在命令行執行“monitor”可執行程序,可以打開。 - adb logcat
adb是Android SDK中platform-tools文件夾下的一個工具,路徑是:“/sdk/platform-tools/adb”。使用這種方式比上面簡單很多,只需要電腦上有“adb”可執行文件,然后使用adb命令即可。adb文件下載鏈接:密碼:xxx1 ,如果下載失效,找你們的研發要一個即可。
adb logcat
- 格式:[adb] logcat [<option>] ... [<filter-spec>] ...
如果提示no matches found:*:W之類錯誤,請給參數加上引號。
Android 的日志分為如下幾個優先級(priority):
- V —— Verbose(最低,輸出得最多)
- D —— Debug
- I —— Info
- W —— Warning
- E —— Error
- F —— Fatal
- S —— Silent(最高,啥也不輸出)
按級別過濾日志
將該級別及以上的日志輸出,例如:
- adb logcat *:W
- *:作為tag參數,這里指所以的tag
- W:作為優先級(priority)參數
即:adb logcat <tag>[:priority]。上面命令會將 Warning、Error、Fatal 和 Silent 日志輸出。
按 tag 和級別過濾日志
<filter-spec> 可以由多個 <tag>[:priority] 組成。如果我們只想打印某tag的日志,那么可以像下面這樣寫:
-
adb logcat StudyTaskCountDownTime:V *:S
- StudyTaskCountDownTime:V
- 打印tag為StudyTaskCountDownTime,日志級別為V及以上的日志。
- 打印其它tag所以級別的日志
- *:S
- 打印所以tag的S級別的日志(視無日志打印)
那么StudyTaskCountDownTime:V 和 *:S合并起來就是:只打印tag為StudyTaskCountDownTime,日志級別為V及以上的日志。
- StudyTaskCountDownTime:V
日志格式
adb logcat -v <format>
brief(默認)
<priority>/<tag>(<pid>): <message>
process
<priority>(<pid>) <message>
tag
<priority>/<tag>: <message>
raw
<message>
time
<datetime> <priority>/<tag>(<pid>): <message>
threadtime
<datetime> <pid> <tid> <priority> <tag>: <message>
long
[ <datetime> <pid>:<tid> <priority>/<tag> ]
<message>
例如:adb logcat -v long ActivityManager:I *:S
清空日志
- adb logcat -c
內核日志
- adb shell dmesg
非root設備執行報權限拒絕。
adb logcat |grep
grep 指令用于查找內容包含指定的范本樣式的文件,如果發現某文件的內容符合所指定的范本樣式,預設 grep 指令會把含有范本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名為 -,則 grep 指令會從標準輸入設備讀取數據。
- 語法
grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<范本樣式>][-f<范本文件>][--help][范本樣式][文件或目錄...]
管道(|)和grep結合,打印一行中包含某字符串的日志,例如:
adb logcat | grep StudyTaskCountDownTime
一行中包含了StudyTaskCountDownTime字符串的日志,加“-i”可以忽略大小寫。grep支持正則表達式,可以寫出更高級的過濾規則。
設置匹配字符串顏色
- adb logcat | grep --color=auto -i StudyTaskCountDownTime,--color取值有:never、always、auto。always和auto。
顯示同一個進程的所有輸出
- adb logcat | grep –color=auto pid
清緩存并執行
logcat 有緩存,如果僅需要查看當前開始的 log,需要清空之前的。
- adb logcat -c && adb logcat
過濾 log 文件
有時需要分析 log 文件,過濾 log 文件還是使用 grep。例如 log 文件為 myapp.log,要匹配 tag 為 MyApp 和 MyActivity 的輸出,然后輸出到 newmyapp.log:
cat myapp.log | grep "^..MyApp\|^..MyActivity" > newmyapp.log
"^..MyApp\ | ^..MyActivity"根據tag在一行中的位置,通過正則表達式來匹配的,所以要更加自己的需要書寫。