O Android 13 introduz uma nova configuração chamada
AutoSingleLayer para travar buffers não sinalizados. Essa configuração permite que o
SurfaceFlinger use um buffer não sinalizado quando apenas uma camada está sendo atualizada.
Isso não se aplica a casos que ocorrem em várias camadas, por exemplo, mudanças de geometria ou transações de sincronização.
Antes, a flag debug.sf.latch_unsignaled no Android Open Source
Project (AOSP) permitia que o SurfaceFlinger bloqueasse todos os buffers não sinalizados, independente do
caso de uso. Quando você ativa essa configuração, ela pode causar efeitos colaterais indesejados, como interromper transações de sincronização e congelar toda a tela enquanto espera buffers incompletos.
No modo AutoSingleLayer, o SurfaceFlinger atualiza apenas um buffer de uma única
superfície em um frame. Esse modo permite que jogos e outros apps em tela cheia se beneficiem da
fixação de buffers não sinalizados e da redução de instabilidade do app sem serem afetados por
congelamentos da tela.
Configurações do modo AutoSingleLayer
No Android 13, AutoSingleLayer é o modo padrão
para o recurso de travamento de buffer não sinalizado. Esse modo é controlado pela
propriedade do sistema debug.sf.auto_latch_unsignaled.
O SurfaceFlinger lê LatchUnsignaledConfig na inicialização. As configurações possíveis são:
LatchUnsignaledConfig::AutoSingleLayerNesse modo padrão do AOSP, o SurfaceFlinger permite o uso de buffers não sinalizados quando uma única camada é atualizada em um frame. A atualização precisa incluir apenas uma atualização de buffer sem transações de sincronização ou mudanças de geometria. Por padrão, esse modo define
debug.sf.auto_latch_unsignaledcomotrue.LatchUnsignaledConfig::DisabledEsse modo desativa o comportamento não sinalizado do bloqueio e bloqueia apenas transações sinalizadas. Esse modo também desativa o modo
AutoSingleLayer. Para configurar esse modo, definadebug.sf.latch_unsignalededebug.sf.auto_latch_unsignaledcomofalse.LatchUnsignaledConfig::AlwaysNesse modo, o SurfaceFlinger trava todos os buffers não sinalizados. Para configurar esse modo, defina
debug.sf.latch_unsignaledcomotrue.
Teste o AutoSingleLayer
Para testar se um buffer está travado sem sinalização, procure os seguintes rastreamentos do SurfaceFlinger no Perfetto:
Figura 1. Rastro de um buffer travado não sinalizado no Perfetto