Android L日志系统2——JavaAPI与liblog

原创 2017年01月03日 19:42:55

在 Android L(包含Android L)之后,Andoird使用了全新的日志系统,也非之前结合Kernel Ring Buffer的方式来存储,读写Log。替而代之是使用新的日志机制Logd。所以说,在/dev/log/下面创建的几个设备,根本就没有使用!没有使用!

其实,init在创建它们的时候,就有说明,只是没有注意到了。

INFO("kernel logger is deprecated\n");

就来分析Android L的日志系统。

从上一篇文章《Kernel的环形Buffer(Ring Buffer)——以Logger Buffer为例》分析可知,Android系统的Log都是用一个环形buffer来存储管理的,换成Logd之后,应该也是通过Ring Buffer来管理,只是由Kernel空间,改成用户空间。那么现在就来看看用户层是如何,往这个buffer中写Log,以及从这个buffer中读出来Log。

在Java层写APP时,一般都会调用android.util.Log这个包的一些静态方式来打印Log;

  1. java.lang.Object
  2. ↳ android.util.Log
  3. API for sending log output.
  4. Generally, use the Log.v() Log.d() Log.i() Log.w() and Log.e() methods.

分析Log.java,Log.v() Log.d() Log.i等等最终都调用到

  1. public static int v(String tag, String msg) {
  2. return println_native(LOG_ID_MAIN, VERBOSE, tag, msg);
  3. }

=》通过JNI调用android_util_Log.cpp

  1. { "println_native", "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native },
  2. ...>
  3. static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,
  4. jint bufID, jint priority, jstring tagObj, jstring msgObj)
  5. {
  6.     //先判断ID是否是一个合法LOG_ID_MAX,这个变量定义在system/下面的Log.h里面 
  7. if (bufID < 0 || bufID >= LOG_ID_MAX) {
  8. jniThrowNullPointerException(env, "bad bufID");
  9. return -1;
  10. }
  11. //取出来TAG
  12. if (tagObj != NULL)
  13. tag = env->GetStringUTFChars(tagObj, NULL);
  14. //取出要写入的Message
  15.      msg = env->GetStringUTFChars(msgObj, NULL);
  16. //调用__android_log_buf_write来写入到buffer
  17. int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);
  18. if (tag != NULL)
  19. env->ReleaseStringUTFChars(tagObj, tag);
  20. env->ReleaseStringUTFChars(msgObj, msg);
  21. return res;
  22. }

__android_log_buf_write是在liblog中实现的。

在liblog中,会通过sokect通讯把要写入log交给logd去处理,大致流程如下:

3e8b95c5-c57e-4db1-831c-4398117c66f5

Android L日志系统1——logd

在介绍完Android M之前的日志系统的实现之后,我们现在来看看现在最新的Android L的日志机制。Android L与之前版本最大的变化,就是日志保存的位置由Kernel的Ringer Buf...
  • koffuxu
  • koffuxu
  • 2016年12月27日 10:12
  • 2024

使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

一、背景   最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼...
  • Xgx120413
  • Xgx120413
  • 2016年12月12日 11:57
  • 5968

Android 读取系统日志LogCat

读取日志需要的权限 uses-permission android:name="android.permission.READ_LOGS"/> 主要代码 package mt...
  • Charein
  • Charein
  • 2014年01月06日 21:09
  • 3545

ANDROID L日志系统——JAVAAPI与LIBLOG

在 Android L(包含Android L)之后,Andoird使用了全新的日志系统,也非之前结合Kernel Ring Buffer的方式来存储,读写Log。替而代之是使用新的日志机制Logd。...
  • omnispace
  • omnispace
  • 2017年08月07日 14:18
  • 141

黑马程序员Java培训、Android培训_JavaAPI-2

由于5月6日的笔记无法编辑,此篇为覆盖 四、             基本数据类型的对象包装类 基本数据类型(不具有对象特性)    包装类 boolean                   ...
  • frank51314
  • frank51314
  • 2011年07月20日 17:11
  • 577

Android设备驱动之——V4L2

http://www.linuxidc.com/Linux/2012-05/60009.htm Video for Linux Two V4L2的是V4L的第二个版本。原来的V...
  • Stephen_yu
  • Stephen_yu
  • 2012年11月13日 09:56
  • 629

Android设备驱动之——V4L2

http://blog.csdn.net/jmq_0000/article/details/7545540 Video for Linux Two                        ...
  • zangchaodotcnatgmail
  • zangchaodotcnatgmail
  • 2013年08月16日 10:24
  • 593

Android设备驱动之——V4L2

Video for Linux Two                        V4L2的是V4L的第二个版本。原来的V4L被引入到Linux内核2.1.x的开发周期后期。Video4Lin...
  • melody157398
  • melody157398
  • 2013年05月15日 14:01
  • 612

USB Camera V4L2 视频录制——Android(1)

博主QQ:1356438802 前传: 前面研究了大半年的OpenCV开源库,其实也是断断续续的研究哈,本来是要做USB Camera图像识别的。但是公司有个项目要做USB Camera视频录制...
  • luoyouren
  • luoyouren
  • 2016年08月04日 18:10
  • 3374

Android设备驱动之——V4L2

转载于: http://blog.csdn.net/jmq_0000/article/details/7545540 Video for Linux Two            ...
  • u013656962
  • u013656962
  • 2016年01月28日 17:34
  • 709
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android L日志系统2——JavaAPI与liblog
举报原因:
原因补充:

(最多只允许输入30个字)