获取空字符串

时间:2015-08-21 15:15:28

标签: android android-logcat

所以我遇到了一些奇怪的东西让我松了一段时间。我一直在尝试打印包含字符串元素的ArrayList的内容,有时,一个元素可能包含一个空字符串,这很好,绝对是我的意图。 所以我有这样的事情:

List<String> l = new ArrayList<String>();

//adding strings in l, sometimes it's an empty string

for (int i=0; i < l.size(); i++) {
    Log.w("element in l : ", l.get(i));
}

所以在这里,当循环打到空字符串时,logcat根本就不打算将它打印出来(这是我困惑的根源),如果你有一条消息跟在那个无法显示的消息之后,突然,失败的消息将显示为包含新的logcat消息。例如,如果您尝试记录像这样的空字符串

Log.w(TAG,  <empty string here>);

Logcat最初不会输出任何内容,然后,当它显示一条新消息时,这就是它打印出来的内容(在这种情况下,新消息是关于AudioTrack的一些警告):

08-21 17:06:02.265  13047-13047/company.myapp W/TAG﹕ [ 08-21 17:06:05.411   766:  937 W/AudioTrack ]
    AUDIO_OUTPUT_FLAG_FAST denied by client

我很想知道这是怎么发生的,也许它可以帮助别人不像我那样让我感到非常困惑。我想尝试记录一个空字符串会触发某种缓冲区,直到它被打印出来,这是一个错误吗?

1 个答案:

答案 0 :(得分:4)

这是一个有趣的问题。我刚刚在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中找到的结构解码所以我认为这是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

基于我快速阅读的内容,我认为发生的事情是消息未正确终止。在附加另一条消息并且第一条消息超出并显示第二条消息之前,空消息不会显示,因为它具有适当的终止。