Logging是定位错误的最重要的部分,但是它很难获得,特别是在手机平台,在应用开发和执行发生在不同的机器上。Android有很好的日志框架来推出Android系统本身和引用程序的日志信息。一套用户水平的应用程序也被提供来浏览和过滤这些日志,例如logcat和Dalvik Debug Monitor Server工具等。
框架:
这个Android日志框架是由命名为logger的内核模块来实现的 。这大量的平台的日志信息在给定的时间使浏览和分析这些日志信息非常困难。为了简化这个过程,这个Android日志框架给日志信息分成了4个独立的日志缓存:
Main:主要应用程序日志信息。
Events:系统事件。
Radio:与基带相关的日志信息。
System:低水平的系统调试信息。
提供了一套API的调用运行Java和native代码来容易的发送日志信息到logger内核模块。这对于本地代码的Logging API获得通过android/log.h头文件。为了使用这个logging函数,本地代码应该首先包含这个头文件。
#include<android/log.h>
除了包含恰当的头文件,这Android.mk文件需要动态的被修改来连接本地模使用log库。这被获得使用LOcal_LDIBS建立系统变量,如下。这个建立系统变量必须被放置在共享库建立片元的前面;否则没有效果的。
LOCAL_MODULE:=hello-jni
....
LOCAL_LDLIBS+=-llog
....
include $(BUILD_SHARED_LIBRARY)
日志信息:
每个通过logging APIs分配给logger模块的日志条目,都有下面的属性:
Priority:可能是vrbose,debug,info,warning,error,fatal。被支持的日志优先水平被定义在android/log.h头文件下,如下:
typedef enum android_LogPriority {
...
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
...
} android_LogPriority;
Tag:定义了发出消息的组件。这个logcat和DDMS工具也能够过滤基于这个标签值得日志信息。这个标签被期望是合理的端。
Meessage:Text文本展示真正的日志信息。这换行符自动的添加到每个日志信息。因为环形日志缓存是相当小的,它强烈的推荐应用程序应该保持日志消息在一个合理的水平。
日志函数:
这个android/log.h头文件定义了一套本地的代码来发出日志消息。
_android_log_write:能够被用来发出一个简单的字符串作为一个日志信息。它取日志优先级,日志标签,和一个日志消息,如下:
__android_log_write(ANDROID_LOG_WARN, "hello-jni", "Warning log.");
_android_log_print:能够被用来发出一个有格式的字符串作为一个日志消息。它取日志优先,log标签和字符串格式,和其他参数的变量数量被指导以这个格式,如下:
__android_log_print(ANDROID_LOG_ERROR, "hello-jni",
"Failed with errno %d", errno);
_android_log_vprint:它和这个_android_log_print函数功能相同,除了额外的参数被传递为一个va_list代替一系列的参数。这个事非常有用的,如果你计划调用logging函数被传递给目前函数的参数的变量数量,如下:
void log_verbose(const char* format, ...)
{
va_list args;
va_start(args, format);
__android_log_vprint(ANDROID_LOG_VERBOSE, "hello-jni", format, args);
va_end(args);
}
...
void example()
{
log_verbose("Errno is now %d", errno);
}
_android_log_assert:能够被用来日志断言错误。与其他的日志函数相比,它并没有一个日志优先和总是发出作为fatal的。如果一个debugger被附加,它也SIGTRAP的目前进程能够近一步检测通过debugger:
if (0 != errno)
{
__android_log_assert("0 != errno", "hello-jni",
"There is an error.");
}