Android systrace / atrace缺少事件,跟踪中的状态不可能

时间:2015-02-16 22:03:02

标签: android graphics systrace surfaceflinger

我目前正在使用Android上的atrace记录和分析视频工作负载期间的操作系统状态。具体来说,我在整个执行过程中监控系统的BufferQueue大小。 atrace记录这些缓冲区随着时间的推移排队/获取的大小。

然而,在我的一些痕迹中,这导致了不可能的情况。 C | 171 | SurfaceView | x行将'x'表示为缓冲区中排队的纹理数。例如,有时在单次获取期间,将删除两个缓冲区而不是一个缓冲区(这应该是不可能的):

     Binder_5-4526   (  171) [002] ...1  1621.656462: tracing_mark_write: B|171|queueBuffer
     Binder_5-4526   (  171) [002] ...1  1621.656493: tracing_mark_write: C|171|SurfaceView|2
surfaceflinger-171   (  171) [002] ...1  1621.664886: tracing_mark_write: B|171|acquireBuffer
surfaceflinger-171   (  171) [002] ...1  1621.664978: tracing_mark_write: C|171|SurfaceView|0

1 个答案:

答案 0 :(得分:1)

在Android平台代码的BufferQueueConsumer.cpp文件中(例如https://android.googlesource.com/platform/frameworks/native/+/android-5.0.1_r1/libs/gui/BufferQueueConsumer.cpp),请查看acquireBuffer函数。

在某些情况下(例如,缓冲区已过期),该函数可能决定从队列中删除缓冲区。没有这个事件发生的atrace指示,你只会看到缓冲区的大小从2跳到0。

还有可能使用紧密交错的queueBuffer / acquireBuffer命令来打印一些意外的缓冲区大小过渡。