Android adb logcat 在模拟器启动期间缺少一些日志

Android adb logcat missing some logs during emulator booting


我在模拟器启动期间尝试搜索一些日志时遇到了一个奇怪的问题。
当我创建一个模拟器时,adb 设备首先以 "offline" 开头,然后我输入
adb logcat -v time | tee log1.txt
并且 adb 将保持 "wait-for-device" 直到 adb 上线。

然后当模拟器启动时,我再次输入 adb logcat -v time | tee log2.txt 除了日志文件的目的地。
现在,我使用 vimdiff log1.txt log2.txt 来比较这两个日志,发现 log1 错过了很多日志 Log_Diff



我不知道为什么 log1.txt 中的某些日志会丢失。 有任何想法吗?

P.S。我在 sdk 中使用 Android 5.1-64 位模拟器。

经过一些研究,我终于在 Android 日志守护进程中找到了根本原因。

主要问题是 LogBufferElement 使用 CLOCK_MONOTONIC 时间戳作为排序索引。

当多个LogBufferElement的时间戳相同时,LogReader可能只会转储最后一个条目。这就是为什么有些日志似乎丢失了。

AOSP Android 5.1 仍然存在这个问题,但是 Android 6.0 已经修复了它。 可以参考这个patch.

顺便说一句,我也对这个补丁做了一些修改。

主要原因是 Android 6.0 支持 C++ 11 原子标准库,但 Android 5.1 还不支持。一些原子 API 需要回滚。 (例如 atomic_fetch_add_explicit())