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

在 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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Liblog已更新至V1.2.1版本,源码下载地址:https://github.com/livisky/liblog/archive/1.2.1.tar.gz Liblog最新教程已收录在w3cschool(http://www.w3cschool.cn/liblog/) ,欢迎评论和支持! 一.简介 Liblog是一个简单易用的Markdown博客系统,它是基于开源框架thinkJS(使用 ES6/7 特性开发 Node.js 框架)开发的nodejs项目 需要mysql数据库支持,具有管理后台功能,更新博客分为普通文章和markdown文章,markdown文章只需要导入你写好的Markdown文件即可。它摆脱了在线编辑器排版困难,无法实时预览的缺点,一切都交给Markdown来完成,一篇博客就是一个Markdown文件。同时也支持评论,代码高亮,分类,标签云,留言板、友情链接、系统设置等常用功能。Liblog提供了不同的主题样式,你可以根据自己的喜好配置,如果你想自己制作博客主题,也是非常容易的。Liblog还支持整站静态网页生成,同时有发布相关的配置,使用nginx做反向代理,动静态资源分离,静态缓存等,使您发布后的博客访问秒开。 二.功能特点 一键导入Markdown文章 文章评论 代码高亮 文章内容分页 系统主题设置 响应式布局,支持手机端访问 良好的SEO 登录/注册/个人心/个人设置 小型bbs,讨论社区 支持cms标签循环 完善的后台及权限控制 三.安装及其他介绍 安装教程:http://www.jsout.com/page/423.html 前台登录:[email protected] 123456 后台登录:admin 123456 安装Liblog之前,请star并fork项目给作者以鼓励。 如果你认可并支持Liblog,还可通过扫描二维码捐赠Liblog(http://www.jsout.com/donate.html) 四.最新版本Liblogv1.2.1更新 【后台管理】添加友情链接管理 1)友情链接增加独立管理菜单,增加审核、排序、隐藏功能 2)友情链接增删查改 3)系统设置-常规设置的友情链接设置项删除 【后台管理】后台主题设置优化,修复设置错误后台打不开的bug 【个人心】修复个性签名设置bug,积分算法bug修复-forlong401 【后台管理】添加社区标签管理功能-forlong401 【后台管理】添加后台文章标签排序功能 【个人心】积分排名榜修复,添加缓存 【后台管理】完善导航管理(新窗口打开、排序等)-斯迈欧 【后台管理】添加系统logo设置-斯迈欧 修复部分已知bug 五.感谢 Liblog的成长需要各位亲们支持!感谢你们使用Liblog,感激你们对Liblog的良好建议与Bug反馈。如果你的博客也是基于Liblog,请告知作者,无偿获取技术指导。 前端汇 http://www.jsout.com 维卡冲突世界 http://www.kixeyes.com Liblog QQ群:256687601 作者邮箱:[email protected] 演示网站:https://www.jsout.com 六.更新日志 详见:https://github.com/livisky/liblog/wiki/updateLog 添加静态资源一键打包功能(html,css,javascript) gulp配置 添加开发和生产运行模式 七.运行程序请选择运行模式 //压缩html,css,js 并生成相应目录 npm run compress //运行开发模式,html,css,js均加载未压缩版本 npm run dev //运行生产模式,html,css,js均加载压缩版本 npm run app //首次运行/更新运行前请先编译项目 npm run compile //线上推荐用pm2来运行(先配置好pm2.json) pm2 start pm2.json 标签:liblog  markdown

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可夫小子

感谢大佬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值