Android的Logger日志系统是基于内核中的Logger日志驱动程序实现的。
日志保存在内核空间中
缓冲区保存日志
分类方法:日志的类型 + 日志的输出量
日志类型: main sysytem radio events
以上四种日志分别通过以下四个设备文件来访问:
/dev/log/main
/dev/log/system
.../radio
.../events
Android系统在应用中提供了三个 Java接口,往Logger日志驱动程序中写入日志,分别对应main, system, event:
android.util.Log
android.util.Slog
android.util.EventLog
Logger日志驱动程序
基础数据结构
Logger主要用到了logger_entry logger_log logger_reader三个结构体。
struct logger_entry {
__u16 len; /* length of the payload */
__u16 hdr_size; /* sizeof(struct logger_entry_v2) */
__s32 pid; /* generating process's pid */
__s32 tid; /* generating process's tid */
__s32 sec; /* seconds since Epoch */
__s32 nsec; /* nanoseconds */
uid_t euid; /* effective UID of logger */
char msg[0]; /* the entry's payload */
};
------------------------------------------------------------------
struct logger_log {
unsigned char *buffer; /* the ring buffer itself 保存内容*/
struct miscdevice misc; /* misc device representing the log 日志设备*/
wait_queue_head_t wq; /* wait queue for readers */
struct list_head readers; /* this log's readers */
struct mutex mutex; /* mutex protecting buffer */
size_t w_off; /* current write head offset */
size_t head; /* new readers start here */
size_t size; /* size of the log */
}
-------------------------------------------------------------------------------------------------------
struct logger_reader {
struct logger_log *log; /* associated log */
struct list_head list; /* entry in logger_log's list */
size_t r_off; /* current read head offset */
bool r_all; /* reader can read all entries */
int r_ver; /* reader ABI version */
};
日志设备的初始化过程
日志设备的初始化:
入口函数:logger_init
日志设备的打开,读取, 写入, 分别对应:logger_open, logger_read, logger_aio_write.
初始化过程:
注册日志设备 kernel/goldfish/drivers/staging/android/logger.c init_log
将日志设备注册到系统中: init_log中调用misc_register函数
在misc_register中调用device_create函数注册到系统中
在设备的/dev目录下看到/dev/log/main, .../events, .../radio
日志设备文件的打开过程
日志驱动程序的读写之前,都需要先打开日志设备文件。日志设备文件的打开函数为looger_open:
kernel/goldfish/drivers/statging/android/logger.c logger_open()
get_log_from_minor根据从设备号获取日志缓冲区
日志记录的读取过程
进程调用read函数,从日志设备中读取日志记录
logger_read被调用:
do_read_log_to_user:
/*
* First, copy the header to userspace, using the version of
* the header requested
*/
/*
* We read from the msg in two disjoint operations. First, we read from
* the current msg head offset up to 'count' bytes or to the end of
* the log, whichever comes first.
*/
/*
* Second, we read any remaining bytes, starting back at the head of
* the log.
*/
运行时库层日志
write_to_log
函数指针write_to_log第一次被调用的时候,便执行函数__write_to_log_init来初始化日志库liblog。
- 日志初始化过程(__write_to_log_init函数):
- 如果 write_to_log 指向__write_to_log_init
执行打开日志设备文件/log/main,.../radio, .../events, .../system到相应的log-fds数组中。
write_to_log指向__write_to_log_kernel
- 如果main, radio, events日志设备文件其中一个没有打开成功
关闭日志文件/log/main,.../radio, .../event,并将write_to_log指向__write_to_log_null
- 如果system日志设备文件没有打开
将system和main的日志记录全都写入到日志设备文件/dev/log/main中
根据参数log_id在全局数组log_fds中找到对应的日志设备文件描述符,
把日志记录写入到Logger日志驱动程序中
__write_to_log_null
该函数什么也不做
__android_log_write
默认情况下,日志记录类型为main。如果参数日志标签以“RIL”开头或HTC_RIL、AT、GSM、STK、CDMA、PHONE、SMS,日志类型则为radio。
__android_log_buf_write
该函数的实现和__android_log_write类似,不过可以指定写入日志记录的类型。
__android_log_vprint __android_log_print __android_log_assert
这三个函数都是调用__android_log_write日志驱动程序写入日志记录的。
__android_log_bWrite __android_log_btwrite
这两个函数写入的日志记录的类型为events。其中,函数__android_log_bwrite写入的日志记录的内容尅有由多个值组成,而后者只能写入一个值。
C/C++日志写入接口
logv logd logi logw loge用来写入类型为main的日志记录
slogv slogd slogi slogw sloge用来写入类型为system的日志记录
log_event_int log_event_long long_event_string用来写入类型为events的日志记录
Java日志写入接口
...
- Android源码笔记——Camera系统架构
Camera的架构与Android系统的整体架构保持一致,如下图所示,本文主要从以下四个方面对其进行说明. Framework:Camera.java Android Runtime:android_ ...
- 精尽Spring Boot源码分析 - 日志系统
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- android 源码 中修改系统字体大小
在源码\android\frameworks\base\core\java\android\content\res \Configuration.java下有读取DEFAULT_FONTSCALE的值 ...
- 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)
2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...
- 驾照理论模拟考试系统Android源码下载
驾照理论模拟考试系统Android源码下载 <ignore_js_op> 9.png (55.77 KB, 下载次数: 0) <ignore_js_op> 10.png ...
- Android源码浅析(五)——关于定制系统,如何给你的Android应用系统签名
Android源码浅析(五)--关于定制系统,如何给你的Android应用系统签名 今天来点简单的我相信很多定制系统的同学都会有一些特定功能的需求,比如 修改系统时间 静默安装 执行某shell命令 ...
- Android源码分析(九)-----如何修改Android系统默认时间
一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARL ...
- Android源码分析(三)-----系统框架设计思想
一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...
- 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)
原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...
随机推荐
- [转载]C#深入分析委托与事件
原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.c ...
- 学习廖雪峰的git教程
地址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 1.git add:添加文件 ...
- Tomcat 日志清除(含扩展AccessLogValve)
1.tomcat的访问日志AccessLogs定期或者定量删除 a 开启tomcat访问日志 编辑${catalina}/conf/server.xml文件.注:${catalina}是tomcat的 ...
- low security dvwa--SQL Injection(Blind)
1.输入单引号,结果如下: 2.输入永真式 ' and 1=1; -- 结果如下: 多次测试,如果输入的条件为假,就会返回1中的结果,为真则返回2中的结果,由此说明这属于SQL盲注. 3.猜解用户名长 ...
- webpack-dev-server轻量级js高速打包、热部署服务器
webpack是一个打包web项目的工具 ,可以实现css,js,less,cass,html的混淆加密,minify,结合webpack-dev-server热部署,非常方便前端页面和Nodejs的 ...
- Android 手机卫士--导航界面3、4和功能列表界面跳转逻辑处理
刚刚花了一点时间,将导航界面3.4的布局和相应的跳转逻辑写了一下: Setup3Activity代码如下: /** * Created by wuyudong on 2016/10/10. */ pu ...
- 获取当前应用的系统路径工具类和java的System.getProperty()方法介绍
java的System.getProperty()方法可以获取的值,如下: 对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? /** ...
- yum安装php,php-fpm
1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 yum remove php.x86_64 php-cli.x86_64 ph ...
- 2016 DTCC(中国数据库技术大会)
上周去参加了2016 DTCC(数据库技术大会),会议总共持续3天,议题非常多,我这里搜集了最新的公开的PPT内容,有兴趣的同学可以下载看看,PPT合集下载链接为:http://pan.baidu.c ...
- [数据科学] 从csv, xls文件中提取数据
在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...