В Android systrace/atrace отсутствуют события, невозможные состояния в трассировках

В настоящее время я использую atrace на Android для записи и анализа состояния ОС во время работы с видео. В частности, я отслеживаю размеры 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

person Shookit    schedule 16.02.2015    source источник


Ответы (1)


В файле BufferQueueConsumer.cpp в коде платформы Android (например, https://android.googlesource.com/platform/frameworks/native/+/android-5.0.1_r1/libs/gui/BufferQueueConsumer.cpp), проверьте функцию AcquiBuffer.

В определенных ситуациях (например, буфер устарел) функция может решить удалить буфер из очереди. Индикация происходящего события отсутствует, вы просто увидите скачок размера буфера с 2 до 0.

Существует также потенциал для тесно чередующихся команд queueBuffer/acquireBuffer, когда они печатают некоторые неожиданные переходы размера буфера.

person Shookit    schedule 18.02.2015