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函数)
  1. 如果  write_to_log 指向__write_to_log_init
执行打开日志设备文件/log/main,.../radio, .../events, .../system到相应的log-fds数组中。
write_to_log指向__write_to_log_kernel
  1. 如果main, radio, events日志设备文件其中一个没有打开成功
关闭日志文件/log/main,.../radio, .../event,并将write_to_log指向__write_to_log_null
  1. 如果system日志设备文件没有打开
将system和main的日志记录全都写入到日志设备文件/dev/log/main中
  • __write_to_log_kernel函数
根据参数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日志写入接口
...

转载于:https://www.cnblogs.com/ithaibo-sit/p/5707916.html

Android源码——Logger日志系统相关推荐

  1. Android源码-Logger日志系统

    Android提供的日志功能是基于liunx中的Logger日志驱动实现,日记驱动是个啥子东东?就是一个虚拟设备,在kernel内核中的一块内存. 整个Android系统的日志有4种类型(括号内为对应 ...

  2. Android源码之Camera系统架构

    2019独角兽企业重金招聘Python工程师标准>>> https://blog.csdn.net/ljsbuct/article/details/7094670 https://w ...

  3. 【Android 源码学习】系统架构和启动流程

    Android 源码学习 系统架构和启动流程 望舒课堂 学习记录整理.以及以下参考文章的整理汇总.便于我个人的学习记录. 感谢IngresGe,Gityuan的精彩文章.为我们这些初探android系 ...

  4. 如何获取android源码

    前言 要想掌握android 只能设备底层开发相关技术,需要先了解android系统源码的基本知识,在了解Android 系统源码之前,需要先获取其具体源码.因为目前世面上主流的操作系统有 Windo ...

  5. Android源码解析(一)动画篇-- Animator属性动画系统

    Android源码解析-动画篇 Android源码解析(一)动画篇-- Animator属性动画系统 Android源码解析(二)动画篇-- ObjectAnimator Android在3.0版本中 ...

  6. mac 系统下android源码下载以及使用(总结)

    曾经买了本android系统内核分析的书,看了一段看不懂,工作也忙,差不多两年过去了,感觉android水平需要提高一下,就装备把书看看,但是在网上找了一些文章,参考了官方的下载方式,最后都没有很好的 ...

  7. android系统源码的环境下用make来编译,Android源码编译系统入门

    做过 Android 平台开发的朋友对make,mm或make clean命令应该很熟悉,但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理?那么今天我就带着大家推开Android编译系 ...

  8. Android源码分析(三)-----系统框架设计思想

    一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...

  9. 在线生鲜订购配送系统,生鲜订购系统 生鲜配送系统 前端+后台 Android源码+SSH后台管理系统+MySQL数据库

    在线生鲜订购配送的系统,包括Android源码+SSH后台管理系统+MySQL数据库. 客服端:功能划分如下 1.我的 登录:账户+密码+验证码 注册:邮箱/手机号注册 订单管理:查看/删除(显示订单 ...

  10. Android 源码 输入系统之 InputReader

    InputReaderThread 线程负责读取事件.InputReaderThread 启动后会执行 threadLoop 函数.threadLoop 函数返回 true,InputReaderTh ...

最新文章

  1. 割点 割边 板子 UVA-796
  2. 用Kotlin写Android Gradle脚本
  3. Struts2 JSON
  4. Leetcode 210. 课程表 II 解题思路及C++实现
  5. java finally的作用_java中finally关键字的特点和作用是什么
  6. UIView编程体验(一)
  7. 怎么解决缺少java.doc_java 生成doc帮助文档时出现的问题
  8. 帝国cms模板仿企业网站
  9. 数据结构-堆 Java实现
  10. HDU - 6297 CCPC直播
  11. android AES对称加密算法使用实例
  12. OpenLinux平台学习(参照Neoway N720/N75 系列产品)
  13. 小胖子日记之扯淡的生活2
  14. java创建工厂方法_Java设计模式(八) 之创建型模式(工厂方法模式)
  15. JavaScript的原型和原型链分析
  16. 在gmail中使用邮件模板功能
  17. 游戏AI车辆(Auto Mobile City)项目开发日志(2021.10.18)
  18. 反激式变换器(Flyback Converter)的工作原理
  19. 输入一行电报文字,将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)。
  20. Springboot+vue+websocket 实现前后台主动通信

热门文章

  1. 维度模型数据仓库基础对象概念一览
  2. 《AutoCAD 2014中文版超级学习手册》——1.2 操作界面
  3. 了解SpringMVC框架及基本工作流程
  4. 防止页面高度不足,引起的底部上浮问题
  5. 【转】What is an entity system framework for game development?
  6. C语言函数调用的底层机制
  7. 「python自动化运维」之自动生成配置文件并上传到目标服务器指定的位置
  8. 这个时代再也难出现贵子
  9. Grup加密(使其不能强制更改密码)
  10. 集群、分布式架构与SOA架构