[MTK] 深入了解Logging Tools 之 Android Log

文摘 MediaTek 2020-03-14 阅读:10094

Android 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整体架构。android_log_arch.png

从上图我们可以看出

  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 也有优先级的概念。相关的优先级定义可以参考下表。

优 先 级含义描述
VVerbose仅在eng版本中打印,在user和userdebug版本都不会打印。最低优先级。
DDebugDebug信息,常用于应用程序的调试。
IInformation用于打印通知信息的Log。
WWarning用于打印警告信息。
EError用于打印一般的错误信息。
FFatal表示信息会引起致命性的错误。
SSilent最高优先级,主要用于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条评论

© 2024 芯缘异码. Powered by Typecho