淺談安卓日志分析
譯文【51CTO.com快譯】眾所周知,日志在應用產品的整個開發生命周期中發揮著重要的作用。例如:在軟件開發過程中,錯誤日志可以幫助開發人員及時地識別出程序中的邏輯錯誤;而在將產品發布到市場之后,支持工程師可以通過分析錯誤日志,來解決各種疑難雜癥。在我們常用的安卓(Android)系統中,各種日志默認是被集中式管理的。當然,市場上有許多可用來開發Android應用的工具,能夠讓應用開發程序員們編寫出自定義的日志消息,以及特定日志語句定義的各種過濾器。目前,Android生態系統提供了不同類型的日志,其中包括:應用日志、系統日志、事件日志、以及廣播日志(Radio Logs)。
日志記錄系統的組成包括:內核驅動程序和內核緩沖區(用于存儲Android日志消息),可用于創建日志條目和訪問日志消息的C、C++和Java類,可用于查看日志消息(logcat)的獨立程序,以及具有查看日志和過濾來自主機的日志消息(通過eclipse或ddms)等組件。
Android系統的Linux內核有著四個不同的日志緩沖區,它們針對系統的不同部分提供著日志記錄。例如:通過文件系統里/dev/log的設備節點,我們可以訪問到Android的四個日志緩沖區:main、event、radio和system。其中main日志用于應用程序,event用于系統事件信息,radio用于電話相關信息,而system則與低級系統消息和調試有關。
日志中的每一條消息都包含有一個標記。通過此類標記我們可以獲悉:該消息來自系統或應用的哪一部分、時間戳(該消息何時到達的)、消息的日志級別(或消息所代表的事件優先級)、以及日志消息體本身(有關錯誤、異常或信息等詳細的說明)。
Android系統中的四大日志類型:
1.應用日志
- 使用android.util.Log類方法,將不同優先級的消息寫到日志中。
- 利用各種Java類,以字符串的形式靜態聲明它們的標記,并傳遞給日志方法。
- 日志方法可用來標識消息的“優先級”(或日志級別)。
- 各種消息檢索工具(logcat)在處理日志時,可以按標識或優先級來進行過濾。
2.系統日志
- 使用android.util.Slog類,來編寫具有不同優先級的消息、及其關聯消息。
- 許多Android框架類都能夠將系統日志(可能比較雜亂)與應用日志消息區分開來。
- 格式化的消息是通過C/C++庫被傳遞到內核驅動的,該驅動能夠將消息存儲到適當的緩沖區(如:系統緩沖區)中。
3.事件日志
- 使用android.util.EventLog類創建事件日志消息,此類消息通常為二進制格式。
- 日志條目包含了二進制標記代碼,并跟隨著二進制參數。
- 消息標記代碼通常被存儲在系統的/system/etc/event-log-tags中。
- 每個消息都帶有日志消息的字符串,以及指向該條目關聯(存儲)值的代碼。
4.廣播日志
- 作用于與電話(調制解調器)相關的信息。
- 日志條目由二進制標簽代碼和消息所組成,可用于提供各種類型的網絡信息。
- 日志記錄系統會自動將帶有特定標記的消息,路由到radio緩沖區中。
Android上日志格式
在Android系統里常見的日志格式為:tv_sectv_nsec priority pidtid tag messageLen Message。其中:
- tag:日志標簽。
- tv_sec&tv_nsec:日志消息的時間戳。
- pid:來自日志消息的進程ID。
- tid:線程ID。
- priority的值可參照如下規律,按照從低到高的順序排列:
- V-詳細(Verbose,最低優先級)*
- D-調試(Debug)*
- I-信息(Info)*
- W-警告(Warning)*
- E-錯誤(Error)*
- F-致命(Fatal)*
- S-靜默(Silent,最高優先級,但不打印任何內容)*
日志文件位置
原則上,Android的各項日志(包括崩潰日志)可以被存儲在多處,且無標準化目錄(即:由系統的ROM所特定)的要求。在此,我們介紹一些常用且常見的目錄:
- /data/anr:Dalvik(譯者注:是Google自行設計的用于Android平臺的虛擬機。)會在ANR處寫入棧的跟蹤,即“應用無響應(Application Not Responding)”,同時也稱為“強制關閉(Force-Close)”。
- /data/dontpanic:此處包含了一些崩潰日志,以便實現各種跟蹤。
- /data/kernelpanics:此處存儲了與“內核錯誤(kernel panic)”相關的日志。
- /data/tombstones:此處會包含多個tombstone_nn文件(nn是從0到10的數字,也就是說,在超過10以后需要重新計數)。
“Log”相關的命令行工具
在實際項目中,我們可以通過各種應用程序或命令行工具,從設備或仿真器上捕獲在Android上產生的相關日志,進而將它們共享給各類開發人員或維護人員,以便他們開展深入的分析。下面是三個常用的命令:
- adb logcat:顯示當前Android系統所有類型的日志。
- adb logcat -v threadtime:在顯示內容中包含日期和時間。
- adb logcat -v threadtime> logfile.txt:將日志存儲在logfile.txt中。
實用的過濾器模式
為了減少數據量,您可以通過在adb命令(請參見-- https://www.pcloudy.com/executing-adb-shell-commands/)中使用如下過濾器(filter),來縮減日志的總量。當然,您也可以使用此類過濾器,來搜索用戶Android設備上的日志文件。
- adb logcat -f:將所有日志保存到一個文件中。
- adb logcat“*:E”:獲取所有的致命錯誤信息。
- adb logcat | grep -i “foo.example.”:獲取與“foo.example.*”相關的所有日志并標記。
- adb logcat“application_or_tag_name:*”“*:S”:按應用名稱獲取所有的日志。
- adb logcat -b events “gsm_service_state_change” “*:S”:獲取所有GSM的狀態更改。
- adb logcat -b radio:獲取所有的廣播事件。
日志分析
至此,我們對Android的日志系統有了基本的了解。在實際分析中,我們通常會關注兩類應用日志,它們分別是:
- 調試日志–在開發和測試階段產生的日志文件。
- 生產日志–由最終用戶在使用過程中直接生成的文件。
我們可以使用諸如GoogleLogTool和SonyLogTool之類的工具,通過采用過濾器模式,進行深入的分析。
原標題:Android Log Analysis ,作者: Bala Murugan
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】