Android提供瞭用戶級輕量的LOG機制,它的實現貫穿瞭Java,JNI,本地c/c++實現以及LINUX內核驅動等Android的各個層次,而且還足夠簡單清晰,是一個相當不錯的解讀案例。本系列文章針對LOG機制的內部實現機理進行解讀,本文是系列之二,解讀Android的Java程序中如何輸出LOG信息到LOG的體系中。
LOG輸出幫助類
Android的Java程序通過android.util.Log類來輸出Log,下圖列出瞭我們常用的Log的靜態方法。
一般,要輸出Log信息,可直接調用Log.v()/Log.d()/Log.i()/Log.w()/Log.e()等類方法。這裡之所以有這麼多有區分的方法,這也是Log的分類。Log的分類就如同Log的靜態常量成員定義的那樣,而Log的優先級按照數字大小排列,數字大的優先級高。而Log.wtf()記錄的則是非常致命的FAULT信息(What a Terrible Failure),報這個錯誤,不光是在Log裡記錄,還要在界面上有提示,並可能殺死當前的進程。
有瞭這些分類,如果要輸出的LOG優先級低於當前設置的優先級,則該Log信息不會顯示。一般的,在Java程序中用Log的方法打印Log之前,應先用isLoggable()判斷一下,該級別是否能被記錄。
另外,用Log.println()能達到與Log.v()/Log.d()/…等方法同樣的輸出效果,隻是在用它時,要指定對應的優先級。
類Log的實現
類android.util.Log的實現是比較簡單的。
類android.util.Log的構造函數是私有的,並不會被實例化,隻是提供瞭靜態的屬性和方法。
而android.util.Log的各種Log記錄方法的實現都依賴於native的實現println_native(),Log.v()/Log.d()/Log.i()/Log.w()/Log.e()最終都是調用瞭println_native()。如Log.d()的實現:
public static int d(String tag, String msg) {
return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
}
Native方法println_native()是通過JNI在c/c++中實現的,詳情參閱本系列之三:JNI及c/c++ 域寫設備文件。