解读Android LOG机制的实现:c/c++域使用LOG
来源:互联网 发布:100本网络禁书下载 编辑:程序博客网 时间:2024/05/17 05:50
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机制的实现:(6)c/c++域使用LOG
- 解读Android LOG机制的实现:c/c++域使用LOG
- 解读Android LOG机制的实现:(3)JNI及c/c++域写设备文件
- 解读Android LOG机制的实现
- 解读Android LOG机制的实现
- 解读Android LOG机制的实现
- 解读Android LOG机制的实现
- 解读Android LOG机制的实现
- 解读Android LOG机制的实现
- 解读Android LOG机制的实现
- 解读Android LOG机制的实现
- 解读Android LOG机制的实现:(2)JAVA域输出LOG
- Android LOG机制的实现的详细解读
- 解读Android LOG机制的实现:(1)LOG的实现架构
- 解读Android LOG机制的实现:(5)获取LOG的应用程序LogCat
- 解读Android LOG机制的实现:(4)LOG设备驱动Logger
- Android LOG机制的实现
- Android LOG机制的实现
- XML1
- HDU 1076 An Easy Task
- 在Linux下编写Daemon
- 直方图均衡化(matlab实现)
- ORACLE 日常诊断工具
- 解读Android LOG机制的实现:c/c++域使用LOG
- 退出程序时读取0xXXXXXXXXX时发生访问冲突
- XML介绍
- 试试这样想模块结构
- ajax 跨域请求返回200 但是不进success--1
- 嵌入式linux平台的NFS移植
- 使用(ImageMagick+tesseract-ocr)实现图像验证码识别实例
- 设置某个类使用或者禁用ARC
- jQuery Mobile十大常用技巧