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++ 域寫裝置檔案。