解讀Android LOG機制的實現:(6)c/c++域使用LOG

來源:互聯網
上載者:User

 

Android提供了的LOG機制的實現貫穿了Java,JNI,本地c/c++實現以及LINUX核心驅動等Android的各個層次,並且簡單明晰,是一個相當不錯的解讀案例。本系列文章針對LOG機制的內部實現機理進行解讀,本文是系列之六,解讀Android的c/c++程式中如何使用LOG機制記錄LOG資訊。

 

 

 

c/c++本地庫中實現LOG輸出

 

通過前面的文章知道Android的Java中通過android.util.Log輸出Log資訊,那Android的本地c/c++程式能不能也通過這樣的機制來記錄Log呢?再回頭看Log現有的c/c++的本地實現,答案當然是肯定的,而且是相當簡單。Android直接在標頭檔(system/core/include/cutils/log.h)裡定義了一些宏就可以很好的實現了。

 

因為,LOG分了VERBOSE/DEBUG/INFO/WARN/ERROR/ASSERT等類別,簡單起見,以DEBUG為例的實現來說明。

 

#ifndef LOGD

#define LOGD(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#endif

 

#ifndef LOGD_IF

#define LOGD_IF(cond, ...) \

    ( (CONDITION(cond)) \

    ? LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) \

    : (void)0 )

#endif

 

#ifndef LOG

#define LOG(priority, tag, ...) \

    LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)

#endif

 

#ifndef LOG_PRI

#define LOG_PRI(priority, tag, ...)                                     \

    ({                                                                  \

       if (((priority == ANDROID_LOG_VERBOSE) && (LOG_NDEBUG == 0)) ||  \

           ((priority == ANDROID_LOG_DEBUG) && (LOG_NDDEBUG == 0))  ||  \

           ((priority == ANDROID_LOG_INFO) && (LOG_NIDEBUG == 0))   ||  \

            (priority == ANDROID_LOG_WARN)                          ||  \

            (priority == ANDROID_LOG_ERROR)                         ||  \

            (priority == ANDROID_LOG_FATAL))                            \

                (void)android_printLog(priority, tag, __VA_ARGS__);     \

    })

#endif

 

#define android_printLog(prio, tag, fmt...) \

__android_log_print(prio, tag, fmt)

 

 

而這一系列宏,最後還是用到了函數__android_log_print()

 

int __android_log_print(int prio, const char *tag, const char *fmt, ...)

{

    va_list ap;

    char buf[LOG_BUF_SIZE];

 

    va_start(ap, fmt);

    vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);

    va_end(ap);

 

    return __android_log_write(prio, tag, buf);

}

 

這裡還是調到了函數__android_log_write()。這個函數應該很熟悉吧,正是前文敘及的c/c++本地函數實現寫裝置檔案的地方。

 

 

 

c/c++程式中記錄Log的做法

 

要在c/c++中記錄Log通常的做法是:

 

定義自己的TAG_LOG宏;包含標頭檔log.h;然後在需要記錄Log的地方直接用LOGV/LOGD/LOGI/LOGW/LOGE即可。

 

比如,檔案lights.c中就在開頭這樣寫,

 

#define LOG_TAG "lights"

#include <cutils/log.h>

 

 

然後在該檔案的後續部分,大量的用了LOGV/LOGE, etc來記錄LOG。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.