本文是学习罗升阳大佬的《安卓系统源代码情景分析》的笔记和总结

一、日志驱动、运行时库层日志库、c/c++日志写入接口、java日志写入接口总结

二、Logcat总结

一、日志驱动、运行时库层日志库、c/c++日志写入接口、java日志写入接口总结

由这张图:

1、注意LOGV、LOGD这些宏操作即c/c++日志写入接口是在Runtime Library 层的,不是在硬件抽象层

2、注意通过c/c++日志接口、java日志接口将日志记录write到Logger驱动的目的是将它们保存起来,这些接口只做write的工作;;read的工作交给logcat来做,logcat将它们读取和显示出来,logcat其实就相当于驱动开发里面调用驱动的应用程序

3、c/c++日志接口、java日志接口最终都是调用运行时库层的liblog的write_to_log-->writev,writev会调用Logger驱动的write

4、Logger驱动使用环形缓冲区保存日志,这缓冲的意思其实就是一个相当于字符数组,由unsigned char * buffer指向

5、注意三个结构体

        logger_entry:就是我们平时打印的一条条日志

        logger_log:日志缓冲区。main、radio、event四种都有自己的一个缓冲区(system和main共用),而且是环形的。它们都由一个个logger_entry组成。里面有个重要参数w_off,表示下一条要写入的日志在日志缓冲区的位置

        logger_reader:表示正在读取某个日志缓冲区日志的进程。里面有个很重要的参数log表示它正在读取的日志缓冲区,r_off表示当前进程要读取的下一条日志在日志缓冲区中的位置

        疑问:w_off在logger_log中,r_off在logger_reader中,为什么r_off不在logger_log中?

        因为一个日志缓冲器可能会被多个进程去读,每个进程都有自己读取的进度,而不是统一的进度,一个新进程的起始读取位置初始化为logger_log里面的成员head。但是w_off就不一样了,日志缓冲区写到一定位置就要将位置指针移动下给下一条日志写入,写满一个环形又重新开始,所以w_off是在logger_log中的

三者之间的关系:

二、Logcat总结

        1、初始化。logcat就是个.cpp程序文件,它会读取命令行的参数进行一系列的初始化,比如adb logcat -v -i等等,它程序里面会根据-v -i进行一系列配置

        2、通过android::readLogLines(devices)读取日志

        先用select函数来同时监控哪个文件当前可读

        可读的日志设备就通过read()读取出来放进相应类型的日志队列中,每次只读一条

        超时的,目前没有新的日志可读的日志设备,这时候就要先处理之前已经读出来的日志

        判断哪些日志需要抛弃

        3、通过 printNextEntry函数,输出日志设备文件的内容

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐