解读Android LOG机制的实现:(6)c/c++域使用LOG

田海立@CSDN

2011/07/24

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。

【本系列文章】

解读Android LOG机制的实现:(1)LOG的实现架构

解读LOG机制的实现架构。

解读Android LOG机制的实现:(2)Java域输出LOG

解读Android的Java程序中如何输出LOG信息到LOG的体系中。

解读Android LOG机制的实现:(3)JNI及NATIVE域写设备文件

解读android.util.Log的JNI实现,以及在c/c++的本地实现中如何操作设备文件写Log信息。

解读Android LOG机制的实现:(4)LOG设备驱动logger

解读LINUX内核中的设备驱动Logger中实现。Logger是Android为Linux写的一个MISC类型驱动,用循环队列实现了读者/写者。Logger是整个LOG机制实现的核心。

解读Android LOG机制的实现:(5)获取LOG程序LogCat

解读应用程序LogCat如何通过对设备文件的open()/select()/read()来获取LOG信息。

解读Android LOG机制的实现:(6)c/c++域使用LOG

解读Android的c/c++程序中如何使用LOG机制记录LOG信息。

更多相关文章

  1. Android(安卓)开发者从0到1发布一个微信小程序的采坑过程——详
  2. Android实现伸缩弹力分布菜单效果
  3. Android消息循环的同步屏障机制及UI渲染性能的提升(Android(安卓)
  4. [置顶] 我的Android进阶之旅------>Android疯狂连连看游戏的实现
  5. 2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
  6. 用android LinearLayout和RelativeLayout实现精确布局
  7. 关于Android中的消息机制和异步
  8. Android实现远程控制PC(Android[客户端]+Qt[服务器端])
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Android简单练习(TableLayout)
  2. Android P SystemUI添加VoWiFi Tile
  3. android录音和得到音量
  4. Android综合小练习Fragment,解析,Handler
  5. Android动态添加删除recycleview并动态保
  6. android 系统文件目录结构
  7. Android仿美图秀秀给图片加框
  8. Android:计算剩余内存
  9. Android切换横屏竖屏生命周期变化
  10. Android 启动Tomcat服务报错,端口占用解决