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

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