Android log 机制 - 删除过多的 log
我们知道,每种 log 数据类型都有一个总量限制,如果超过了这个限制,为了腾出空间,就需要删除一些旧数据。这个删除旧数据的功能,便是 LogBuffer::prune
来完成的。
我们知道,每种 log 数据类型都有一个总量限制,如果超过了这个限制,为了腾出空间,就需要删除一些旧数据。这个删除旧数据的功能,便是 LogBuffer::prune
来完成的。
写入 log 数据时,我们先通过 socket 读取客户端 log,然后调用 logBuffer->log
函数写入 log 缓冲并唤醒读 log 的客户端。由于每种类型的 log 数据都有总量限制,写入数据后可能需要删除旧数据。由于篇幅关系,删除旧数据这一部分下一篇再讲。
按计划,在本篇,我们先看 LogBuffer
的初始化,然后深入 LogListener
。LogListener
用于接受客户写入的 log 数据。虽然在 main
函数里先创建的是 LogReader
,这里我们还是先看 LogListener
,毕竟,先写了 log,才有东西可以读。
Android 早期版本使用的是一个 log 驱动,后来逐渐使用 logd 进程替代(具体哪个版本我就没有去探究了,至少在 Android 8.0 里,log 驱动已经被移除)。原有 log 驱动负责的功能,都由 logd 完成。此外,logd 还可以读取 Linux 内核 printk
、selinux 的 log。
从 Android 2.3 开始,Java、native 层都可以把 Message 放到 Looper 线程处理,但是这两个世界的 Message 是完全不相关的。在本篇,我们先了解 Java 世界的 Message 是如何入队、出队的。
在使用一个服务的时候,客户端并不知道服务的位置,所以需要跟名字服务器查询。在 binder 架构中,扮演名字服务器这个角色的,就是 service manager。