作者:华清远见讲师

日志是故障处理最重要的部分,但是它难以实现,特别是在那些使用两个不同机器进行开发和执行的移动平台上。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);

}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐