android core log,Android 日志系统(Logcat)的实现分析

这篇说一下Android 日志系统的实现:

1. Android中的打印分为4个缓冲区和6个打印等级,在frameworks\base\core\java\android\util\Log.java中有定义:

四缓冲:

public static final int LOG_ID_MAIN = 0;

public static final int LOG_ID_RADIO = 1;

public static final int LOG_ID_EVENTS = 2;

public static final int LOG_ID_SYSTEM = 3;

六等级:

public static final int VERBOSE = 2;

public static final int DEBUG = 3;

public static final int INFO = 4;

public static final int WARN = 5;

public static final int ERROR = 6;

public static final int ASSERT = 7;

2.Android Log打印有两种,一种是Java层添加的,一种是C/C++代码中添加的,如下图:

0818b9ca8b590ca3270a3433284dd417.png

上图可以很容易看出,不管是java,还是C/C++,其实最终调用的driver接口都是一样的,java只是通过了jni调用了Android框架下实现的Liblog本地库,而C/C++则是直接调用的本地库。

Andorid Log的实现其实是一个典型的Android框架下的APK如何进行系统调用到驱动的实现。

3.从上面的流程可以很难清晰地知道Android代码中整个log的写入实现流程,而最终log输出最终的实现是/system/bin/logcat的一个工具。

其实/system/bin/logcat的实现也就是通过系统调用,读取的/dev/log/main、/dev/log/radio、/dev/log/events、/dev/log/system四个驱动文件中的缓冲信息。

具体实现可以参考源码:/system/core/logcat/logcat.cpp

4. 最后说一下Android代码中添加打印

a. java中添加打印

import android.util.Log;

使用Log.v()、Log.d()、Log.i()、Log.w()、Log.e()

b. C/C++中添加打印

两种方法:

第一种:

1、在Android工程的Android.mk文件中添加如下内容:

LOCAL_SHARED_LIBRARIES := liblog libutils

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

2、在JNI的实现代码文件(.c或者.cpp)中加入包含LOG头文件的如下代码:

#include

3、在需要打印的方法中添加打印代码,例如:

__android_log_print(ANDROID_LOG_INFO, "JniX431FileTest", "lsx_init");

// ANDROID_LOG_INFO:是日志级别;

// "JniX431FileTest":是要过滤的标签,可以在LogCat视图中过滤。

// "lsx_init":是实际的日志内容。

#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO  , "ProjectName", __VA_ARGS__)

#define LOGW(...) __android_log_print(ANDROID_LOG_WARN  , "ProjectName", __VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , "ProjectName", __VA_ARGS__)

4、LOGV(...)、LOGD(...)、LOGI(...)、LOGW(...)、LOGE(...) 也直接使用函数__android_log_print()

第二种、使用宏ALOGV、ALOGD、ALOGI、ALOGW、ALOGE   // 宏的实现在头文件android/log.h中

例:ALOGW("%s : set OMX_IndexMstarTeePath failed!!", componentName.c_str());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java接口的几种常见用法

接口(interface)对于面向对象编程来说是一个非常重要的概念。它是一系列方法的声明,却没有具体实现。有些编程语言,比如swift,把接口解释成“协议(protocol)”,我觉得也是非常的恰当…

android矢量图 内存大,Android内存控制小技巧-使用矢量图来节省你的内存并简化你的开发。...

先上一个 位图和矢量图的 说明。外链网址已屏蔽维基百科里面有更详细的说明 我就不贴地址了。简单来说就是位图 比 矢量图要大。但是位图可以适用于各种场景。但是矢量图就只能显示一些有规律的图形。复杂的做不了或者是很难做。对于android来说,我们一般app里面 会…

linux下利用nohup后台运行jar文件包程序

Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 java -jar XXX.jar & &am…

idea 快捷键代码行标记并快捷跳到标记行

idea有一个组合快捷键 标记代码行(左边的行数会出现一个1,代表着已经标记了) ctrlshift1 迅速跳到标记行 ctrl1 这边给大家送上显示GIF

android十进制转十六进制算法,十进制转十六进制 代码

5621转换为16进制数的方法是“除16取余”方法,5621/16=商351余5,16进制最后一位为5351/16=商21余15,16进制右边第二位为F21/16=商1余5,16进制右边第三位为51/16=商0余1,1…

鸿蒙之火是什么意思,鸿蒙突然火了!鸿蒙是什么?

原标题:"鸿蒙"突然火了!"鸿蒙"是什么?什么是鸿蒙?鸿蒙是什么?很多人都在发问,仿佛一夜之间就火了的鸿蒙有何独特之处?鸿蒙是真的来了。鸿蒙是文化,鸿蒙也是科技…

String类的indexOf方法的用法和举例

String类的indexof方法的作用和返回值: 今天在这里重点回顾一下,希望对大家能有所帮助: indexOf(int,ch) 先看第一个indexOf它返回值是int,在看它的参数(int,ch&#x…

java中String对象作为参数传递问题

问题 java中将对象作为参数传递究竟是值传递还是引用传递? 1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。 2、对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参…

html语言怎么办到直接手写,4、手写HTML语言代码之《文字处理》

千里之堤始于足下!!学习网页制作的心得体会4.........手写HTML语言代码之《文字处理》一、和(居中对齐)下面网页我的第一个网页教师自制教学软件的背景随着教育体制的改革和信息时代的到来,可能越来越多的同学己经不再适应看着教师的板书、记着笔记的学习方式&#…

接口interface修饰符相关问题总结

1、抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。 原因如下: 抽象方法没有方法体,是用来被继承的,所以不能用private修饰;static修饰的方法可以通…

html纵向字幕无缝滚动,HTMl中marquee标签实现无缝滚动跑马灯效果示例

本篇文章小编给大家分享一下HTMl中marquee标签实现无缝滚动跑马灯效果示例,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。标签,它是成对出现的标签,首标签和尾标签之间的内容就是滚动内容。…

Java字符串池(String Pool)深度解析

在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(String Pool&#xff0…

优酷html5视频网站,国内主要视频网站的嵌入方式

来一篇水文,整理一下国内各大视频网站的视频嵌入方式,或许有一点用处。爱奇艺、优酷、搜狐视频、腾讯视频、酷6、土豆、乐视。这些视频站绝大多数都采用 Flash 的方式播放,很多也提供了 iframe 的播放方式。根据最新标准应当使用 &#xff0c…

Java中取余(%)和取模(Math.floorMod)的区别

之前一直都认为取模和取余是一样的,甚至还怀疑设计语言的大神们不是脑子有问题么,为什么要整两个一样的东西,现在想想还是自己太 low了,竟然不能 get 到大神们的良苦用心。今天莫名其妙的用到了Java的取模方法,发现竟然…

用dl元素编辑html个人信息,html dl dt dd标签元素语法结构与使用

dl dt dd认识及dl dt dd使用方法一、dl dt dd认识 - TOPhtml 是一组合标签,使用了dt dd最外层就必须使用dl包裹,此组合标签我们也又叫表格标签,与table表格类似组合标签,故名我们也叫dl表格(扩展阅读:table tr td、…

千牛怎么注销卖家店铺_新店铺怎么拥有亚马逊购物车?亚马逊小卖家如何尽快获得黄金购物车?...

我做跨境电商也有六年的时间了,在电商这个行业也有自己的一些经验。经验也许没有其他大卖家丰富,但会将我知道的都进行分享。如果有不懂得亚马逊问题可以我(V:772024802)。我这里给大家安排一堂直播课,可以系统的帮你解决做亚马逊…

mysql中like是否使用索引

一.测试数据 CREATE TABLE test_orderdetail (id int(11) NOT NULL AUTO_INCREMENT,order_id int(11) DEFAULT NULL,product_name varchar(100) DEFAULT NULL,cnt int(11) DEFAULT NULL,create_date datetime DEFAULT NULL,PRIMARY KEY (id),KEY idx_orderid_productname (pro…

Ppt2010中HTML是什么,2010dw1html简介.ppt

2010dw1html简介课程名称:网页设计时间:周二 晚20:00到21:50地点:西配320教室教材:Dreamweaver网页设计案例教程weilei;第一节 网络及html简介;1.1 www的基本概念 ;1.2 网页访问流程( www的结构);1.3 浏览器;1.4网页设计基本概念 …

如何对一个对象进行深拷贝?

介绍 在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。而深拷贝则是拷贝了源对象的所有值,…

电子科大16秋计算机应用基础在线作业一,电子科大16秋《计算机应用基础(本科)》在线作业3...

电子科技大学电子科大16秋《计算机应用基础(本科)》在线作业3一、单选题(共35 道试题,共70 分。)1. 在Windows,打开一个菜单后,其中某菜单项会出现下属级联菜单的标识是()。A. 菜单右侧有一组英文提示B. 菜单右侧有一个黑色三角形C. 菜单左侧有一个黑色圆点D. 菜单左…