1. 程式人生 > >不是安卓工程師,也能看logcat日誌

不是安卓工程師,也能看logcat日誌

前言

寫這篇部落格的靈感,來自於最近工作的刺激。手上有好幾個專案不定期出現問題,而自己又去不了開發現場看日誌分析問題、做debug操作。

目前比較流行的兩種檢視日誌的方式有:
1. 開發者通過在開發工具的logcat視窗檢視日誌輸出。優點:具備日誌篩選功能,能夠比較容易的找到關鍵資訊。缺點:需要裝備整套的安卓開發環境。
2. 在程式中新增儲存日誌到檔案的功能。優點:能夠捕獲到更完整詳細的日誌。缺點:儲存的日誌太多,幾百上千行,看起來太累。

準備工作

需要具備基礎的計算機技能、Java開發環境和Android sdk。

下載Android SDK

下載地址:Windows

MacLinux

下載完成後,目錄結構截圖如下:(以Mac版本為例,目錄結構差異不大)
這裡寫圖片描述

通常下載下來的sdk只集成了基礎的開發工具,如:模擬器、點9作圖工具、ddms。看日誌需要的adb工具在platform-tools目錄下,可以執行tools目錄下的android程式下載。
這裡寫圖片描述

完整下載後,應該有如下檔案:
這裡寫圖片描述

配置環境變數

不確定adb執行環境是否需要JRE(Java執行環境)支援,因為每次搭建Android開發需要先安裝jdk、下載Android SDK、下載eclipse 或 AndroidStudio,所以未曾驗證。只是提醒下,如果adb 使用有問題,可以考慮是否安裝JRE。

檢查電腦上是否已安裝JRE,可以嘗試著執行如下命令,正確顯示 jdk版本號為正常:
這裡寫圖片描述

將platform-tools目錄新增到系統環境變數中,以方便在終端操作。
以Mac環境為例,修改使用者目錄下.bash_profile檔案。之後使用命令source ~/.bash_profile使修改的配置檔案生效。
這裡寫圖片描述

依舊使用命令adb -version檢查配置環境變數是否成功。
這裡寫圖片描述

開啟手機開發者模式

不同品牌的手機,開啟開發者模式的方式大不相同,因此不做概述。

相關命令

做好一切,就可以將手機連線到電腦除錯。個人覺得,Windows系統有個比較噁心的問題就是usb的驅動。如果在使用中,同樣遇到這個問題,建議使用豌豆莢等PC端的手機管理軟體。他們會只能匹配usb驅動,類似於驅動精靈。開啟開發者模式的方式,也做了相應的引導。

連線裝置

啟動adb服務:adb start-server
檢視連線裝置:adb devices
停止adb服務:adb kill-server

這裡寫圖片描述

*注:這裡停止adb服務命令只做演示用途,檢視日誌時,在檢查手機成功連線上電腦之後,不能停止adb服務。

檢視日誌

使用adb logcat命令,執行後如下:
這裡寫圖片描述

這輸出的日誌也是一大坨,而且還不停的輸出,看上去眼花繚亂。主要是因為沒做篩選。

以上輸出的資訊包含了:日期、時間、PID、TID、日誌級別、標籤、日誌內容。

PID:可以看成app執行時,在系統中的唯一的一個標識。
UID:PID可以對應多個TID,主要是由於支援多執行緒。每個執行緒對應一個TID。
日誌級別:Android Log類原始碼中,日誌有6個級別。常用的5個分別是 V(Verbose 明細,最低級別)、D(Debug 除錯)、I(Info 資訊)、W(Warn 警告)、E(Error 錯誤)。
標籤:開發中,標記日誌的一個屬性。如,使用類名,表示是哪個類裡輸出的日誌。

篩選日誌

可以根據PID(同一時刻包名和PID是一一對應關係)、TID、日誌級別、日誌標籤、日誌內容做篩選。考慮到篇幅關係暫且只介紹使用PID、日誌級別、標籤篩選日誌。

根據日誌級別篩選

命令模板:adb logcat 標籤:日誌級別 (*:s)。

篩選Warn級別以上的日誌(包含Error)命令:adb logcat *:W 表示不匹配標籤。
這裡寫圖片描述

根據標籤篩選

篩選System的日誌命令:adb logcat System:* *:s第一個星號表示不匹配日誌級別, *:S用於設定所有標記的日誌優先順序為S,這樣可以確保僅輸出符合條件的日誌。
這裡寫圖片描述

根據PID(應用包名)篩選

由於應用每次啟動後,系統分配的PID都不一樣。因此,需要根據包名或UID篩選日誌時,需要先啟動應用,再使用命令adb shell dumpsys meminfo 包名 檢視到UID資訊,最後根據PID篩選日誌。

這裡寫圖片描述

根據PID 18270(圖中所示)篩選日誌 ,命令adb logcat | grep 18270:

這裡寫圖片描述

圖中可以看出,PID 18270 是唯一的,右邊的TID可以有多個值。橫向匹配的18270 是沒有新增*:s導致的。

綜合篩選

這裡寫圖片描述

儲存日誌

儲存到手機

命令模板:adb logcat -f 手機上檔案目錄 標籤:日誌級別 *:s | grep PID

如:adb logcat -f /sdcard/Download/log.txt JPush:D *:s | grep 18270

儲存到電腦

命令模板:adb logcat > 電腦上檔案目錄 標籤:日誌級別 *:s | grep PID

如:adb logcat > ~/Desktop/log.txt JPush:D *:s | grep 18270

儲存的檔案內容如下:

這裡寫圖片描述