В Android 13 представлена новая конфигурация AutoSingleLayer для фиксации несигнализированных буферов. Эта конфигурация позволяет SurfaceFlinger фиксировать несигнализированный буфер при обновлении только одного слоя. Она не применяется к случаям, происходящим между слоями, например, при изменении геометрии или транзакциях синхронизации.
Ранее флаг debug.sf.latch_unsignaled в Android Open Source Project (AOSP) позволял SurfaceFlinger блокировать все несигнальные буферы, независимо от варианта использования. Включение этой конфигурации может привести к нежелательным побочным эффектам, например, к прерыванию транзакций синхронизации и заморозке всего дисплея в ожидании неполных буферов.
В режиме AutoSingleLayer SurfaceFlinger обновляет только буфер одной поверхности в кадре. Этот режим позволяет играм и другим полноэкранным приложениям использовать функцию фиксации несигнализированных буферов и снижать зависания приложений, не страдая при этом от зависаний экрана.
Настройки режима AutoSingleLayer
В Android 13 AutoSingleLayer является режимом по умолчанию для функции защелкивания несигнализированного буфера. Этот режим управляется системным свойством debug.sf.auto_latch_unsignaled .
SurfaceFlinger считывает LatchUnsignaledConfig при загрузке. Возможные конфигурации:
LatchUnsignaledConfig::AutoSingleLayerВ этом режиме AOSP по умолчанию SurfaceFlinger разрешает блокировку несигнализированных буферов при обновлении одного слоя в кадре. Обновление должно включать только обновление буфера без синхронизирующих транзакций или изменений геометрии. По умолчанию в этом режиме
debug.sf.auto_latch_unsignaledустанавливается вtrue.LatchUnsignaledConfig::DisabledЭтот режим отключает поведение защелки без сигнала и блокирует только сигнальные транзакции. Этот режим также отключает режим
AutoSingleLayer. Чтобы настроить этот режим, установитеdebug.sf.latch_unsignaledиdebug.sf.auto_latch_unsignaledв значениеfalse.LatchUnsignaledConfig::AlwaysВ этом режиме SurfaceFlinger блокирует все буферы в несигнальном состоянии. Чтобы настроить этот режим, установите
debug.sf.latch_unsignaledвtrue.
Тест AutoSingleLayer
Чтобы проверить, заблокирован ли буфер в несигнальном состоянии, найдите следующие следы от SurfaceFlinger в Perfetto :

Рисунок 1. След защелкнутого несигнального буфера в Perfetto