Android Logging System Architecture

来源:互联网 发布:软件架构和软件结构 编辑:程序博客网 时间:2024/04/27 13:22

任何一本讲述Android开发的教科书在讲如何用模拟器调试应用程序的时候都会用到Log类的Java API以及配套工具logcat或者DDMS。这是Android系统里面单独设计的一整套Log机制,与Kernel Log机制类似,也有优先级 (Priority) 的概念,虽然优先级的定义稍有不同。除此之外,还对Log添加了对应的TAG,以此来对Log的类别作区分。后面我们将详细讲述该Logging机制。

Android Logging System Architecture

Android Logging System对Java层以及Native层都提供了对应的API,我们通过下图先看一下Android Logging System整体架构。Android Log Architecture

从上图我们可以看出

1. 在 Kernel 层,设计了4个 Logger 设备及相应的驱动程序,这4个 Logger 设备分别采用了一块内存区域作为循环缓冲区,用于存放 main/system/event/radio log。详细的实现代码可以参考文件 kernel/drivers/staging/adroid/logger.c

2. 在 Native 层封装了对 kernel log buffer 的写入操作,并且在写入前根据传入的TAG决定是否将log写入到 Radio Log Buffer。作为Library向上层提供API。详细的实现可以参考文件夹 system/core/liblog/ 下面的文件。

3. 为了方便 Native 应用程序以及共享库的开发,提供了 macro 定义的 Log wrapper,这样在 Native 层可以直接使用 LOGV/LOGD/LOGI/LOGW/LOGE 以及相关的 API 打印 Log 到 Log Buffer. 详细的定义以及其他相关的 macro 可以参考文件 system/core/include/log/log.h

4. 为了给 Java层提供接口,在 Native 层实现了JNI接口,为 Java 层服务。详细的实现可以参考文件夹 frameworks/base/core/jni/ 下面的 android_utils_Log.cpp 和 android_utils_EventLog.cpp 文件。

5. 在 Java 层对 JNI 接口进行了封装,分别实现了 android.util.Log 和 android.util.EventLog 类,用于给 Java Application 以及 Java library 提供 Log 接口。详细的实现可以参考 frameworks/base/core/java/android/util/ 下面的 Log.java 和 EventLog.java 文件。

API 与优先级

和 Kernel Log 机制类似,Android Logging System 也有优先级的概念。相关的优先级定义可以参考下表。

优先级
含义
描述
V
Verbose
仅在eng版本中打印,在user和userdebug版本都不会打印。最低优先级。
D
Debug
Debug信息,常用于应用程序的调试。
I
Information
用于打印通知信息的Log。
W
Warning
用于打印警告信息。
E
Error
用于打印一般的错误信息。
F
Fatal
表示信息会引起致命性的错误。
S
Silent
最高优先级,主要用于logcat过滤Log,S优先级所有Log都不会输出。

优先级的设置有两个用途,一是可以利用优先级来揭示Log的重要程度,自然越致命的信息越重要。二是Log工具可以根据不同的Log级别来过滤掉不关心的Log。

搭配不同的Log级别,就衍生出了各个级别的Log API。

例如,在Native层定义了如下的Macro,LOGV / LOGD / LOGI / LOGW / LOGE,用来打印不同级别的log。(此处举例的API并非 Native层定义的所有的API,请参考 system/core/include/log/log.h 文件查阅完整的定义)

而在Java层的 android.util.Log 类则定义了 Log.v / Log.d / Log.i / Log.w / Log.e 接口,用于在Java层打印Log。更完整的API定义请参考文件 frameworks/base/core/java/android/util/Log.java

0 0