解讀Android LOG機制的實現:(2)JAVA域輸出LOG – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

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++ 域寫設備文件。

You May Also Like