Rastrear transições de janela usando Winscope

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:

  1. Baixe a fonte do Android .
  2. Navegue até a pasta Winscope:

    cd development/tools/winscope
    
  3. Instale dependências usando:

    npm install
    

    Para ver uma lista de comandos disponíveis, execute: npm run

  4. Crie todos os destinos de produção e teste usando:

    npm run build:prod
    
  5. 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:

  1. Ative as opções do desenvolvedor .
  2. Selecione Rastreamento do sistema em Opções do desenvolvedor .
  3. Habilite Coletar rastreamentos do Winscope .
  4. Em Diversos :
    1. Ative Anexar gravações a relatórios de bugs .
    2. Habilite Mostrar bloco de configurações rápidas .
  5. Navegue até onde você precisa reproduzir o bug.
  6. Para iniciar a captura, abra Configurações rápidas e selecione Registrar rastreamento :

    quick_setting_winscope

    Figura 1. Menu de configuração rápida com Record Trace.

  7. Execute apenas as etapas necessárias para reproduzir o bug.

  8. Para interromper a captura, abra Configurações rápidas e selecione Parar rastreamento .

  9. 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:

  1. Na tela Coletar rastreamentos , clique em Proxy ADB :

    capture_traces_winscope

    Figura 2. Capture rastreamentos no Winscope.

  2. Inicie o proxy Winscope ADB Connect para capturar rastros diretamente do seu navegador.

  3. Execute o comando:

    python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
    
  4. Para iniciar a captura, na tela Collect Traces selecione os alvos e a configuração e clique em Iniciar rastreamento :

    collect_traces_winscope

    Figura 3. Colete rastreamentos no Winscope.

  5. Para interromper a captura, clique em Finalizar rastreamento :

    end_trace_winscope

    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 :

dump-winscope

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) ou all (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:

  1. Carregue seus traços salvos usando o painel à direita. Você pode remover rastreamentos carregados ou carregar mais rastreamentos.

    upload_traces_winscope

    Figura 6. Carregar rastreamentos no Winscope.

  2. 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.

    view_traces_winscope

    Figura 7. Visualização de rastreamentos no Winscope.

    Use a IU no painel superior da janela para renomeareditar nome e baixe o rastreamento enviadodownload_trace ou para fazer upload de um novo.

  3. 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 esquerdoarrow_left_time e certoarrow_right_time 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 zoomzoom_in_time ou diminuir o zoomzoom_out_time 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 cimaarrow_up_time (canto inferior direito).

    time_nav_winscope

    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:

    expand_time_winscope

    Figura 9. Linha do tempo expandida no Winscope.

  4. 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:sf_trace

      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 zoomzoom_in_time e diminuir o zoomzoom_out_time nas camadas para melhor inspeção.
        • O botão de reinicializaçãoreset_sf (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.

      wm_trace

      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:

      transaction_trace

      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:

      protolog_trace

      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:

      transitions_trace

      Figura 14. Rastreamento de transições no Winscope.