作者:华清远见讲师
日志是故障处理最重要的部分,但是它难以实现,特别是在那些使用两个不同机器进行开发和执行的移动平台上。Android有一个扩展日志框架,用于对系统范围内Android系统本身的信息及应用程序的信息集中做日志。它还提供了一组用户级应用程序以查看和过滤这些日志
Android 日志框架是名字为logger的内核模块。随时随地地对平台上的任何信息进行日志会产生大量信息,从而使得查看和分析浙西日志变得非常困难。为了简化这个过程,Android日志框架吧日志消息分成4个日志缓冲区
Main 主要应用程序的日志信息
Event 系统事件
Radio Radio 相关的日志信息
System 调试时产生的低级系统调试信息
这4个缓冲区以伪设备的形式保存在dev/log系统目录下。因为移动平台上的I/O操作代价很大,所以日志信息要保存在内存中,而不能保存在永久性存储器(例如磁盘中)。为了有效的控制对存储日志信息的保存在内存中
存储空间的充分利用
MAIN,RADIO,SYSTEM 64kb
256KB 的日志缓冲区
开发者不希望直接与logger内核模块进行交互,Android运行库系统提供了一组API调用以便于java代码和原生代码想logger内核模块发送日志信息。通过android/log.h头文件来展示原生代码的日志API。为了使用日志函数,原生代码需要先向包含该头文件。
#include
除了要包含合适的头文件,还需要动态修改Android.mk文件从而将原生模块与日志库进行链接,可以通过使用构建系统变量LOCAL_LDLIBS完成操作,
LOCAL_LALIBS += -llog
此语法必须在include前面
日志消息
通过日志API发送给logger模块的每个日志条目都具有以下字段:
Priority:取值分别为verbose,debug,info,warning,error和fatal,表示日志的重要程度,支持的日志优先级在android/log.h头文件中声明,
支持的日志优先级
typedef enmu android_LogPriority
{
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR
ANDROID_LOG_FATAL,
}android_LogPriority;
生成简单的日志消息
_android_log_write(ANDROID_LOG_WARN,"hello-jni","warning log.");
生成格式化的日志消息
_android_log_print(ANDROID_LOG_ERROR,"hello-jni",
"Failed with errno %d",erron);
//参数分别是日志优先级,日志标签和日志消息
3、_android_log_vprint:粗糊了参数传递方式外,其他功能与_android_log_print 函数完全相同,_android_log_vprint函数用va_list传递附加参数,而_android_log_print函数中以连续参数的凡是改为传递参数,如果想要调用日志函数时传递给当前函数的参数个数动态变化时,该函数的优势就会体现出来。
void log_verbose(const char* format,...)
{
va_list args;
va_start(args,format);
_android_log_vprint(ANDROID_LOG_VERBOSS,"hello-jni",format,args);
va_end(args);
}
void example()
{
log_verbose("Error is now %d",error);
}