这是一个有趣的问题.我只是在LogRabbit中尝试过,并且能够看到相同的结果.
我快速浏览了android源代码,看到Log.W(…)最终以本机代码显示并在logd_write.c中得到处理
这基本上将数据写入/ dev / log / main(或其他日志之一)
您可以这样获取这些日志:
adb pull /dev/log/events .
adb pull /dev/log/main .
adb pull /dev/log/radio .
adb pull /dev/log/system .
您将需要按cntl-C,否则复制将永远发生.
查看/ dev / log / main中的原始日志,我看到消息确实被记录了:
<8b>F×U^_<8c>^Y^U^Emfl_MessageList^@Before Empty^@^R^@^@^@!z^@^@!z^@^@
<8b>F×U^_<8c>^Y^U^Emfl_MessageList^@^@^]^@^@^@!z^@^@!z^@^@
<8b>F×U^_ <8c>^Y^U^Emfl_MessageList^@After Empty^@7^@^@^@^@^E^@^@^Z^E^@^@
这被logger.h中的struct解码,所以我认为这是adb中的问题.从此处拉出source code :(看起来那里有很多未记录的命令)
这是主要功能
static int logcat(TransportType transport, const char* serial, int argc, const char** argv) {
char* log_tags = getenv("ANDROID_LOG_TAGS");
std::string quoted = escape_arg(log_tags == nullptr ? "" : log_tags);
std::string cmd = "shell:export ANDROID_LOG_TAGS=\"" + quoted + "\"; exec logcat";
if (!strcmp(argv[0], "longcat")) {
cmd += " -v long";
}
--argc;
++argv;
while (argc-- > 0) {
cmd += " " + escape_arg(*argv++);
}
return send_shell_command(transport, serial, cmd);
}
看那里,我发现所有logcat所做的基本上是这样的:
adb shell
> exec logcat
因此,我认为问题的根源在于logcat本身. Logcat.cpp呼叫log_read.c
根据我快速阅读的内容,我认为正在发生的事情是消息未正确终止.空消息直到附加另一条消息并且第一条消息超限并显示第二条消息才显示,因为它具有适当的终止.