读取的过程就是通过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设计当中的设计模式的理念,从日志的参数判断,日志的异常处理,日志设备的开启,日志的读取,日志的格式化,日志的过滤,各个文件各司其职,各显神通,大体上符合了单一责任原则,很美妙的代码,不过某种意义上来讲,并不是完美的代码。