读取的过程就是通过logcat命令读取LOG日志的过程,这一篇完毕日志部分就算完毕了
一、数据结构:
主要是两个链表,一个是日志链表,一个是日志设备链表,实体如下:
1、queued_entry_t:日志实体结构体,包含日志实体本身,也就是第二学当中的日志结构体,包括pid、tid、标签、内容、长度、时间
2、log_device_t:日志设备结构体,包含日志设备内容以及其中保存的日志实体结构体表
3、AndroidLogEntry_t :日志输出的格式,包含时间、日志类型、日志标签、日志内容和长度、日志进程信息
3、日志实体链表中的排序是按时间排序的
二、读取流程:
logcat程序文件位置:system/core/logcat/logcat.cpp
1、读取logcat调用时的参数设置(此处为默认设置)
2、创建读取日志设备的对象
3、判断日志的输出位置,输出到屏幕还是文件
4、打开日志设备
5、读取日志设备文件
6、遍历日志设备将当前读取指针调整到每一个日志设备的可读位置
7、遍历日志设备,将日志设备中可读的日志队列放入到读取对象当中
8、日志队列取出完毕后,遍历取出的日志队列并按照时间输出
9、再次判断输出参数中是否包含日志输出条数的设置
10、判断日志是否为二进制输出格式
11、将日志格式化为AndroidLogEntry_t格式
12、然后根据日志的priority进行过滤,判断日志是否需要输出(为什么不在取日志的时候直接过滤)
13、输出日志
14、如果日志是输出到文件中,则关闭文件
总结:
可以看到一些android设计当中的设计模式的理念,从日志的参数判断,日志的异常处理,日志设备的开启,日志的读取,日志的格式化,日志的过滤,各个文件各司其职,各显神通,大体上符合了单一责任原则,很美妙的代码,不过某种意义上来讲,并不是完美的代码。