[MTK] 深入了解Logging Tools 之 Android Log
文摘 MediaTek 2020-03-14 阅读:11234Android Log
任何一本讲述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整体架构。
从上图我们可以看出
- 在 Kernel 层,设计了4个 Logger 设备及相应的驱动程序,这4个 Logger
设备分别采用了一块内存区域作为循环缓冲区,用于存放 main/system/event/radio log。详细的实现代码可以参考文件
kernel/drivers/staging/adroid/logger.c - 在 Native 层封装了对 kernel log buffer 的写入操作,并且在写入前根据传入的TAG决定是否将log写入到
Radio Log Buffer。作为Library向上层提供API。详细的实现可以参考文件夹 system/core/liblog/
下面的文件。 - 为了方便 Native 应用程序以及共享库的开发,提供了 macro 定义的 Log wrapper,这样在 Native
层可以直接使用 LOGV/LOGD/LOGI/LOGW/LOGE 以及相关的 API 打印 Log 到 Log Buffer.
详细的定义以及其他相关的 macro 可以参考文件 system/core/include/log/log.h - 为了给 Java层提供接口,在 Native 层实现了JNI接口,为 Java 层服务。详细的实现可以参考文件夹
frameworks/base/core/jni/ 下面的 android_utils_Log.cpp 和
android_utils_EventLog.cpp 文件。 - 在 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。