3

我有一个单声道应用程序,它同时播放很少的声音,日志中有很多这样的消息。这是什么意思?

W/AudioFlinger(   34): write blocked for 84 msecs, 2153 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 69 msecs, 2182 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 76 msecs, 2205 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 70 msecs, 2236 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 73 msecs, 2269 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 75 msecs, 2300 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 70 msecs, 2325 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 69 msecs, 2356 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 75 msecs, 2386 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 70 msecs, 2418 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 80 msecs, 2445 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 71 msecs, 2473 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 90 msecs, 2498 delayed writes, thread 0xc658
W/AudioFlinger(   34): write blocked for 72 msecs, 2528 delayed writes, thread 0xc658
4

4 回答 4

4

这意味着您应该忽略这些消息。:-)

每条消息都包含一个进程 ID (pid),它是括号内的值。这些消息来自 pid 34;您的进程不太可能是 pid 34。

您可以使用adb shell ps来获取进程列表。

例如,在我的 Nexus One 上,我看到:

W/AudioFlinger(14104): write blocked for 172 msecs, 901 delayed writes, thread 0xea50

什么是 pid 14104?

$ adb shell ps | grep 14104
media     14104 1     23992  1996  ffffffff 00000000 S /system/bin/mediaserver

/system/bin/mediaserver当然不是您应该过度关注的应用程序。:-)

您如何确定 Mono for Android 进程的 pid?通过查找进程启动消息。在进程启动期间,Android 将列出ContentProvider它正在加载到进程中的所有 s。感兴趣的是__mono_init__提供者:

I/ActivityThread(  602): Pub TouchTest.TouchTest.__mono_init__: mono.MonoRuntimeProvider

上面的消息来自你的 Mono for Android 进程,所以所有带有 pid 602 的消息(在这种情况下)都将是来自你的应用程序的消息;您可以随意忽略其他 pid。

于 2012-06-08T14:35:00.370 回答
3

它可能是也可能不是你可以忽略的东西。输出该消息的过程确实不是您的应用程序,但这并不意味着该消息不是由您的应用程序引起的。您的应用程序通过 Binder 与位于 mediaserver 进程中的 AudioFlinger 进行通信,因此警告消息的 PID 不是您的应用程序的 PID。然而,该消息可能是因为请求 AudioFlinger 播放数据的速度比实际应该播放的音频数据快(基于采样率、通道数和缓冲区的大小)。如果应用程序正在使用 AudioTrack 类来写入原始数据(并且这是从多个线程完成的?),那么数据发送的速度可能比播放速度快,因此 AudioFligner 是“过载”的。

于 2012-12-11T20:58:11.073 回答
2

快速谷歌搜索后,我发现这AudioFlinger是提供最低要求音频功能的音频软件实现。它实现AudioHardwareInterface,这基本上是硬件抽象层,它从 Android 平台隐藏驱动程序特定的音频实现(见下图)。

在此处输入图像描述

就像开发人员一样,支持 Android 框架的库可以将信息记录到 logcat。一些设备记录的数量非常可笑(根据我的经验,即支持三星设备的库),而另一些则记录的很少。无论哪种方式,您都不应该担心这些日志,因为它们特定于 Android 操作系统的内部工作。它们不反映您的应用程序存在任何问题。你可以忽略它们。

于 2012-06-08T14:55:50.080 回答
0

是的,正如 Jnop 所说,让我们忽略它。让我分享我的经验,可能对某些人有用。我们通常会忽略这些消息,因为它不会对功能造成任何问题,并且 android 平台会记录有关内核进程、库、应用程序框架等的大量信息,这些信息可能对 API 开发人员有用,而不是对应用程序开发人员有用。

如果您使用 NDK 开发应用程序,那么了解本地方法显然会有所帮助。

如果 MediaPlayback 和 MediaPlayer API 上的文档需要,我建议您理解这个概念。

1)http://developer.android.com/guide/topics/media/mediaplayer.html 2)什么是关键类 3)MediaPlay 回放实现的最佳方法 4)https://groups.google.com/forum /?fromgroups#!topic/android-developers/s6Bqu3K20Ng

如果您已经实施,也请分享您的经验。因为我强烈认为它们是 Mediaplayer 中的已知问题,Android 开发团队可能出于某种原因对此并不感兴趣。

您可以单击暂停按钮来停止冗长的记录消息,并且您可以轻松地在 logcat 窗口中滚动。

于 2012-06-15T06:59:51.280 回答