Winscope é uma ferramenta web que permite aos usuários gravar, reproduzir e analisar os estados de vários serviços do sistema durante e após animações e transições. Winscope registra todos os estados de serviço do sistema pertinentes em um arquivo de rastreamento. Usando a UI do Winscope com o arquivo de rastreamento, você pode inspecionar o estado desses serviços para cada quadro de animação, com ou sem gravação de tela, reproduzindo, percorrendo e depurando as transições.
Os serviços do sistema que produzem rastreamentos que podem ser carregados no Winscope são os seguintes:
- SurfaceFlinger
- Gerenciador de janelas
- WMSshell
- IME
- Lançador
Execute o visualizador de rastreamento Winscope
O rastreamento do Winscope faz parte dos serviços da plataforma. Esta seção descreve as etapas necessárias para baixar, construir e executar o visualizador de rastreamento Winscope.
Siga estas etapas para configurar seu PC para executar o rastreador Winscope:
- Baixe a fonte do Android .
Navegue até a pasta Winscope:
cd development/tools/winscope
Instale dependências usando:
npm install
Para ver uma lista de comandos disponíveis, execute:
npm run
Crie todos os destinos de produção e teste usando:
npm run build:prod
Execute o Winscope usando:
npm run start
Capturar rastros
Você pode capturar rastreamentos no dispositivo , por meio do Winscope ou por meio de comandos do Android Debug Bridge (adb) .
Capture rastros no dispositivo
Capture rastros no dispositivo para coletar dados ao registrar bugs devido a problemas de animação. Todos os rastreamentos da IU são registrados com esse método, pois a configuração não pode ser personalizada.
No seu dispositivo Android:
- Ative as opções do desenvolvedor .
- Selecione Rastreamento do sistema em Opções do desenvolvedor .
- Habilite Coletar rastreamentos do Winscope .
- Em Diversos :
- Ative Anexar gravações a relatórios de bugs .
- Habilite Mostrar bloco de configurações rápidas .
- Navegue até onde você precisa reproduzir o bug.
Para iniciar a captura, abra Configurações rápidas e selecione Registrar rastreamento :
Figura 1. Menu de configuração rápida com Record Trace.
Execute apenas as etapas necessárias para reproduzir o bug.
Para interromper a captura, abra Configurações rápidas e selecione Parar rastreamento .
Compartilhe o registro capturado usando uma das opções listadas, como Gmail, Drive ou BetterBug.
Capture rastros através do Winscope
Você pode capturar rastros usando Winscope para desenvolvimento e depuração local. Winscope usa adb , que suporta conexão de dispositivos via USB ou Wi-Fi.
No Winscope:
Na tela Coletar rastreamentos , clique em Proxy ADB :
Figura 2. Capture rastreamentos no Winscope.
Inicie o proxy Winscope ADB Connect para capturar rastros diretamente do seu navegador.
Execute o comando:
python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
Para iniciar a captura, na tela Collect Traces selecione os alvos e a configuração e clique em Iniciar rastreamento :
Figura 3. Colete rastreamentos no Winscope.
Para interromper a captura, clique em Finalizar rastreamento :
Figura 4. Fim do rastreamento no Winscope.
À medida que a ferramenta carrega os rastreamentos na interface do Winscope, as mensagens Fetching and Parsing Proto Files aparecem na tela.
Gere o dump de estado usando Winscope
Para fazer um dump de estado usando o Winscope, na tela Collect Traces selecione a guia Dump e clique em Dump state :
Figura 5. Estado de dump no Winscope.
Capture rastros por meio de comandos adb
Execute adb root
antes de executar os comandos adb shell
para cada um dos rastreamentos a seguir. No final do rastreio, os arquivos de rastreio estão disponíveis em /data/misc/wmtrace
. Para copiar um arquivo ou diretório e seus subdiretórios de um dispositivo, consulte Copiar arquivos de e para um dispositivo . Consulte adb para obter mais informações.
Rastreamentos do WindowManager
Para capturar rastros do WindowManager:
Ativar rastreamento:
adb shell wm tracing start
Desativar rastreamento:
adb shell wm tracing stop
Salve os dados de registro em um arquivo enquanto executa uma captura de rastreamento:
adb shell wm tracing save-for-bugreport
Rastreamento de log uma vez por quadro:
adb shell wm tracing frame
Registre cada transação:
adb shell wm tracing transaction
Defina o tamanho máximo do log (em KB):
adb shell wm tracing size
Imprimir status do rastreamento:
adb shell wm tracing status
Defina o nível de log como
critical
(apenas janelas visíveis com informações reduzidas),trim
(todas as janelas com informações reduzidas) ouall
(todas as janelas e informações):adb shell wm tracing level
ProtoLog
Os comandos a seguir são usados para o sistema ProtoLog .
No processo system_server
:
Inicie o ProtoLog:
adb shell cmd window logging start
Pare o ProtoLog:
adb shell cmd window logging stop
Habilite o ProtoLog para determinados grupos de log:
adb shell cmd window logging enable [group...]
Desative o ProtoLog para determinados grupos de log:
adb shell cmd window logging disable [group...]
Habilite o registro do Logcat para determinados grupos de logs:
adb shell cmd window logging enable-text [group...]
Desative o registro do Logcat para determinados grupos de logs:
adb shell cmd window logging disable-text [group...]
No WMSshell:
Inicie o ProtoLog:
adb shell dumpsys activity service SystemUIService WMShell
Rastreamento de transição
Os seguintes comandos são usados para rastreamento de transição:
No processo system_server
:
Inicie um rastreamento:
adb shell cmd window shell tracing start
Pare um rastreamento:
adb shell cmd window shell tracing stop
Inicie um rastreamento no WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
Interrompa um rastreamento no WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
Editor de método de entrada
Os seguintes comandos são usados para rastreamento do Input Method Editor (IME):
Inicie o rastreamento IME para clientes de método de entrada (IM), serviço de método de entrada (IMS) e serviço de gerenciamento de método de entrada (IMMS):
adb shell ime tracing start
Comece a rastrear clientes IME, IMS e IMMS:
adb shell ime tracing stop
Camadas SurfaceFlinger
O rastreamento de camada SurfaceFlinger usa rastreamento Perfetto para captura. Consulte Configuração de rastreamento para obter informações de configuração.
Consulte o exemplo a seguir de uma configuração para rastreamento de camada SurfaceFlinger:
unique_session_name: "surfaceflinger_layers_active"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
Consulte o comando de exemplo a seguir para gerar rastreamento para camadas SurfaceFlinger:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
Transações SurfaceFlinger
O rastreamento de transação do SurfaceFlinger usa o rastreamento Perfetto para captura. Consulte Configuração de rastreamento para obter informações de configuração.
Veja o exemplo a seguir de uma configuração Perfetto para rastreamento ativo do SurfaceFlinger:
unique_session_name: "surfaceflinger_transactions_active"
buffers: {
size_kb: 1024
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
write_into_file: true
file_write_period_ms: 100
Veja o exemplo a seguir de uma configuração Perfetto para rastreamento contínuo SurfaceFlinger:
unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
size_kb: 1024
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_CONTINUOUS
}
}
}
Consulte o comando de exemplo a seguir para gerar rastreamento para transações do SurfaceFlinger:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
Gerar dump de estado usando adb
Winscope lê um instantâneo dos estados WindowManager e SurfaceFlinger de relatórios de bugs. Os relatórios de erros armazenam os estados como arquivos proto separados dentro da pasta proto
. Para gerar dumps de estado usando adb, execute os comandos a seguir.
Para WindowManager:
adb exec-out dumpsys window --proto > window_dump.winscope
Para SurfaceFlinger:
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
Analisar rastros
Para depurar estados transitórios e inválidos que causam problemas de animação, o Winscope agrega diferentes arquivos de rastreamento, fornece pesquisa e visualização em quadros e linhas de tempo e apresenta mensagens protobuf de maneira coerente. A análise de rastreamentos no Winscope ajuda a identificar a camada, o quadro e o estado exatos da ocorrência do bug.
Usar Winscope
Depois de capturar os rastros , analise-os no Winscope:
Carregue seus traços salvos usando o painel à direita. Você pode remover rastreamentos carregados ou carregar mais rastreamentos.
Figura 6. Carregar rastreamentos no Winscope.
Clique em Visualizar rastreamentos para visualizar os rastreamentos carregados. As guias para cada traço aparecem no painel superior da janela. Se o arquivo carregado contiver os rastreamentos relevantes, uma visualização flutuante do rastreamento de gravação da tela será sobreposta na tela.
Figura 7. Visualização de rastreamentos no Winscope.
Use a IU no painel superior da janela para renomear e baixe o rastreamento enviado ou para fazer upload de um novo.
Navegue pelos traços ao longo do tempo usando a ferramenta deslizante de tempo no painel inferior da janela. Para navegação adicional no tempo, use os seguintes recursos, conforme mostrado na Figura 8:
- Para navegar até um horário ou ocorrência específica, use o cursor (controle deslizante de tempo) ou o botão esquerdo e certo setas na caixa de exibição da hora (canto inferior esquerdo) ou setas para a esquerda e para a direita no teclado.
- Para exibir os traços codificados por cores selecionados na linha do tempo, use o menu suspenso (à esquerda do controle deslizante de tempo). Por padrão, os três últimos rastreamentos visualizados usando as guias de rastreamento são exibidos na linha do tempo.
- Para uma visão granular de todos os rastreamentos carregados, use o zoom ou diminuir o zoom ferramenta (sob o controle deslizante de tempo) ou role no teclado. Use o botão reset para redefinir o nível de zoom.
- Para uma visão expandida da distribuição de rastreamento ao longo do tempo, clique na seta para cima (canto inferior direito).
Figura 8. Navegação temporal no Winscope.
Na visualização expandida (Figura 9), selecione e amplie intervalos de tempo específicos para melhor inspeção:
Figura 9. Linha do tempo expandida no Winscope.
Para examinar os rastros, você pode visualizar o estado do dispositivo com a gravação da tela. Para examinar um traço específico, clique na guia de traço relevante no painel superior da ferramenta.
Para o rastreamento do Surface Flinger , três painéis exibem diferentes visualizações do rastreamento em um determinado período de tempo, conforme mostrado na Figura 10:
Figura 10. Rastreamento do Surface Flinger no Winscope.
Visualização de camadas : uma visualização 3D das camadas em sobreposições retangulares. Os seguintes elementos de UI ajustam os retângulos para renderizar os elementos gráficos em termos de posição, tamanho, transformação e ordem z:
- O controle deslizante Rotação (canto superior esquerdo da visualização Camadas) gira os retângulos em camadas para visualizá-los nos ângulos escolhidos.
- O controle deslizante Espaçamento (canto superior direito da visualização Camadas) ajusta o espaçamento entre as camadas para criar a visualização composta escolhida.
- As ferramentas de zoom (canto superior direito da visualização Camadas) aumentam o zoom e diminuir o zoom nas camadas para melhor inspeção.
- O botão de reinicialização (canto superior direito da visualização Camadas) restaura as configurações da câmera para a visualização original.
- Arraste os retângulos para facilitar um melhor zoom.
Visualização de hierarquia : uma hierarquia completa das camadas.
- Somente visível (canto superior direito da visualização Hierarquia), quando selecionado, oculta camadas invisíveis da hierarquia para ajudar a visualizar os elementos na tela.
- Plana (canto superior direito da visualização Hierarquia), quando selecionada, mostra a hierarquia como uma lista nivelada de camadas.
- Mostrar diferença (canto superior esquerdo da visualização Hierarquia) é selecionado somente quando há uma transição de estado. Quando selecionada, a ferramenta compara o estado atual com o anterior. Um novo elemento é destacado em verde, um elemento excluído é destacado em vermelho e um elemento modificado é destacado em azul.
Visualização de propriedades : Propriedades da camada selecionada. O painel superior da visualização Propriedades contém informações apenas sobre propriedades principais, como Visibilidade , Geometria e Buffer . O painel inferior da visualização Propriedades contém um Proto Dump de todas as propriedades.
- A caixa de seleção Mostrar Diferença (canto superior esquerdo da visualização Propriedades) se comporta como na visualização Hierarquia .
- Mostrar padrões (canto superior esquerdo da visualização Propriedades), quando selecionado, exibe os valores proto padrão no Despejo de Proto. Por padrão, esses valores não estão listados no Proto Dump. Os valores proto padrão são obtidos da definição do campo proto. Se um campo proto não tiver um valor padrão não nulo definido, os valores proto padrão mostrados são:
- Sequências: Nulas
- Números: 0
- Valores booleanos: falso
- Objetos: Nulo
A seleção entre as três visualizações e a gravação da tela são sincronizadas, ou seja, todos os rastreamentos são atualizados de forma síncrona quando você navega para um ponto diferente no tempo. Para ver as propriedades de uma camada, selecione a camada clicando nela na visualização Hierarquia ou clicando no respectivo retângulo na visualização Propriedades. Um retângulo roxo indica que um traço de visualização está anexado a esta camada. Ao clicar duas vezes em uma camada roxa, a IU navega para mudar para a guia de rastreamento de visualização relevante.
Para o rastreamento do Window Manager , três painéis exibem diferentes visualizações do rastreamento em um determinado período de tempo, conforme mostrado na Figura 11:
- Visualização do Windows : Uma visualização 3D das camadas.
- Visualização de hierarquia : uma hierarquia completa das camadas.
- A visualização Propriedades contém um Proto Dump de todas as propriedades.
A seleção entre as três visualizações e a gravação da tela são sincronizadas, ou seja, todos os rastreamentos são atualizados de forma síncrona quando você navega para um ponto diferente no tempo.
Figura 11. Rastreamento do Gerenciador de Janelas no Winscope.
Para rastreamentos de transações , as transações entre o Surface Flinger e o Window Manager são apresentadas em formato de tabela que pode ser pesquisado pelos IDs, tipo e texto exibidos, juntamente com uma visualização de propriedades que mostra o proto dump. A seleção entre as duas visualizações e a gravação da tela são sincronizadas:
Figura 12. Rastreamento de transações no Winscope.
Para rastreamentos do ProtoLog , as informações são apresentadas em formato de tabela, que pode ser pesquisado por tags, arquivos de origem e texto:
Figura 13. Rastreamento do ProtoLog no Winscope.
Para rastreamentos de transições , uma lista de transições com ID, tipo, horário de envio, duração e status é exibida junto com as propriedades da transição selecionada:
Figura 14. Rastreamento de transições no Winscope.