android core log,Android 日志系统(Logcat)的实现分析
這篇說一下Android?日志系統(tǒng)的實現(xiàn):
1. Android中的打印分為4個緩沖區(qū)和6個打印等級,在frameworks\base\core\java\android\util\Log.java中有定義:
四緩沖:
public static final int LOG_ID_MAIN = 0;
public static final int LOG_ID_RADIO = 1;
public static final int LOG_ID_EVENTS = 2;
public static final int LOG_ID_SYSTEM = 3;
六等級:
public static final int VERBOSE = 2;
public static final int DEBUG = 3;
public static final int INFO = 4;
public static final int WARN = 5;
public static final int ERROR = 6;
public static final int ASSERT = 7;
2.Android Log打印有兩種,一種是Java層添加的,一種是C/C++代碼中添加的,如下圖:
上圖可以很容易看出,不管是java,還是C/C++,其實最終調用的driver接口都是一樣的,java只是通過了jni調用了Android框架下實現(xiàn)的Liblog本地庫,而C/C++則是直接調用的本地庫。
Andorid Log的實現(xiàn)其實是一個典型的Android框架下的APK如何進行系統(tǒng)調用到驅動的實現(xiàn)。
3.從上面的流程可以很難清晰地知道Android代碼中整個log的寫入實現(xiàn)流程,而最終log輸出最終的實現(xiàn)是/system/bin/logcat的一個工具。
其實/system/bin/logcat的實現(xiàn)也就是通過系統(tǒng)調用,讀取的/dev/log/main、/dev/log/radio、/dev/log/events、/dev/log/system四個驅動文件中的緩沖信息。
具體實現(xiàn)可以參考源碼:/system/core/logcat/logcat.cpp
4. 最后說一下Android代碼中添加打印
a. java中添加打印
import android.util.Log;
使用Log.v()、Log.d()、Log.i()、Log.w()、Log.e()
b. C/C++中添加打印
兩種方法:
第一種:
1、在Android工程的Android.mk文件中添加如下內容:
LOCAL_SHARED_LIBRARIES := liblog libutils
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
2、在JNI的實現(xiàn)代碼文件(.c或者.cpp)中加入包含LOG頭文件的如下代碼:
#include
3、在需要打印的方法中添加打印代碼,例如:
__android_log_print(ANDROID_LOG_INFO, "JniX431FileTest", "lsx_init");
// ANDROID_LOG_INFO:是日志級別;
// "JniX431FileTest":是要過濾的標簽,可以在LogCat視圖中過濾。
// "lsx_init":是實際的日志內容。
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO ?, "ProjectName", __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN ?, "ProjectName", __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR ?, "ProjectName", __VA_ARGS__)
4、LOGV(...)、LOGD(...)、LOGI(...)、LOGW(...)、LOGE(...)?也直接使用函數(shù)__android_log_print()
第二種、使用宏ALOGV、ALOGD、ALOGI、ALOGW、ALOGE ? // 宏的實現(xiàn)在頭文件android/log.h中
例:ALOGW("%s : set OMX_IndexMstarTeePath failed!!", componentName.c_str());
總結
以上是生活随笔為你收集整理的android core log,Android 日志系统(Logcat)的实现分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cdh 添加jar包_使用maven下载
- 下一篇: mysql日期格式化季度_Mysql按周