我创建的一个应用程序会在客户的设备上导致大量的日志垃圾邮件:
我在NDK环境中使用OpenSL进行实时音频生成。每次我使用SLAndroidSimpleBufferQueueItf的Enqueue()函数时,android都会创建一个日志条目,因为该调用隐式地调用音频接口上的play()。
这看起来像这样:
........app start........
06-05 21:36:48.619: I/System.out(10081): Debugger has connected
06-05 21:36:48.619: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:48.819: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.419: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.619: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.829: I/System.out(10081): debugger has settled (1491)
// ....some other unimportant logging stuff was here ....
06-05 21:36:53.359: D/execute(10081): Creating audio output OpenSLES
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating the engine
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Realizing engine
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): retrieving engine interface
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating output mix
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Realizing output mix
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Configuring audio source
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Configuring audio sink
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating audio player
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): realizing the player
// Who is that? I assume Android itself....
06-05 21:36:53.379: D/AudioTrack(10081): Request AudioFlinger to create track
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): Retrieving play interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): get buffer queue interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): registering buffer queue callback
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): Retrieving effect send interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): getting volume interface
06-05 21:36:53.379: D/execute(10081): First process call...
06-05 21:36:53.379: D/execute(10081): Will start playback
06-05 21:36:53.379: D/play(10081): Starting playback
// And the show starts here: Every time I Enqueue audio data in my C++ code, this log entry appears.
06-05 21:36:53.379: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.389: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.409: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.609: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.629: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.679: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.739: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.759: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.819: D/AudioTrack(10081): start 0x1f7bf8
....... and so on这就是我如何将一个新的音频缓冲区排队到OpenSLES:
bool SE::AudioOutputOpenSLES::enqueueBuffer( void* _buffer, unsigned int _byteSize )
{
SLresult result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, _buffer, _byteSize );
return( result == SL_RESULT_SUCCESS );
}OpenSLES不会抱怨该调用,并返回SL_RESULT_SUCCESS。
我用谷歌搜索了一下,发现日志条目来自Android源AudioTrack,我在这里找到了它:
start()函数的开头是日志记录:
LOGV("start %p", this);但是,是什么让OpenSL在每次新缓冲区入队时都隐式调用play()?我在这里看了一下OpenSL的规范:http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf
在第174页,他们说“当播放器处于SL_PLAYSTATE_PLAYING状态时,增加缓冲区将隐含地启动播放。在由于队列中缓冲区不足而导致饥饿的情况下,音频数据停止播放。播放器保持在SL_PLAYSTATE_PLAYING状态。当额外的缓冲区排队时,音频数据恢复播放。请注意,排队的缓冲区不足会导致音频数据流出现可听间隙。在播放器不处于播放状态的情况下,添加缓冲区不会启动音频播放。”
由于手机没有爆裂,我假设音频仍然播放得很好,文档中的描述听起来就像他们总是隐含地开始播放,这实际上意味着我没有机会阻止这种日志垃圾邮件。
有什么想法吗?
发布于 2013-09-03 15:13:05
我的意思是,这很依赖于Android,不同的Android版本,不同的制造商,不同的Android版本会有所不同。
我不确定为什么最终客户会为日志而烦恼,但我会在logcat中进行筛选以忽略它。简单的解决方案可能是最好的,特别是当垃圾邮件的来源是android :s
https://stackoverflow.com/questions/16948749
复制相似问题