Android Native C Log

Android 提供了log系統方便調試

0 Java層提供了Log.i, log.d, log.e ...

1 C++ 則有 ALOGW, ALOGE, ALOGI ...

    /*
     * Android log priority values, in ascending priority order.
     */
    typedef enum android_LogPriority {
        ANDROID_LOG_UNKNOWN = 0,
        ANDROID_LOG_DEFAULT,    /* only for SetMinPriority() */
        ANDROID_LOG_VERBOSE,
        ANDROID_LOG_DEBUG,
        ANDROID_LOG_INFO,
        ANDROID_LOG_WARN,
        ANDROID_LOG_ERROR,
        ANDROID_LOG_FATAL,
        ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
    } android_LogPriority;

        #define LOG_NDEBUG 0 // 設置debug 級別爲0, 則LOGV, LOGI, 等全部生效
        #define LOG_TAG "keyword"
        #include <cutils/log.h>
        LOGD("%s() in %s, Line: %d\n", __func__, __FILE__, __LINE__);

2 如果是我們在使用Native C在做的時候,實際上也是可以利用LOG來輸出調試信息的。查看方式一樣。

2.1 方法1
    #include <utils/Log.h>
    我們查看這個文件system/core/include/cutils/log.h

    #ifndef LOG_TAG
    #define LOG_TAG NULL
    #endif

    對於這個詞我們的敏感度,我們知道,需要設置TAG信息。
    那麼我們可肯定是需要在使用這個log.h前,定義一個LOG_TAG

    那麼在Native C中我們常用的做法如下
    #define LOG_TAG "keyword"
    #include <utils/Log.h>

    然後使用LOGI,LOGD,LOGV,LOGW,LOGE來輸出log信息,例如
    LOGD("%s() in %s, Line: %d\n", __func__, __FILE__, __LINE__);

    然後在adb shell 中使用
    logcat -s keyword
    即可查看到 LOG_TAG 爲 "keyword" 的debug信息
2.2 方法2
    2.2.1 在對應的mk文件中加入
        LOCAL_LDLIBS := -llog
    2.2.2 在要使用LOG的cpp文件中加入
        #include <android/log.h>
        #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "keyword", __VA_ARGS__)

    2.2.3 這樣就可以使用
        LOGD("%s() in %s, Line: %d\n", __func__, __FILE__, __LINE__);

    這樣,在logcat端看到的輸出是
        D/keyword( 32): ......

    如果想改變輸出中的各項內容,可以參考相應顏色的標示,比如,如果想定義LOGE,就可以把上面的ANDROID_LOG_DEBUG改成ANDROID_LOG_ERROR,同理,LOGI什麼的也都以此類推
    #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "keyword", __VA_ARGS__)
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG ,  "keyword", __VA_ARGS__)
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO  ,  "keyword", __VA_ARGS__)
    #define LOGW(...) __android_log_print(ANDROID_LOG_WARN  ,  "keyword", __VA_ARGS__)
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , "keyword", __VA_ARGS__)
    當然,如果不嫌麻煩,也可以直接使用__android_log_print函數,而不define定義LOGxxx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章