Pesquisa de trace

Use SQL para encontrar estados específicos em rastreamentos do Winscope Perfetto. Use o visualizador global Pesquisar na interface do Winscope para executar consultas e visualizar resultados em tabelas:

guia do visualizador de pesquisa

Figura 1. Guia "Visualizador de pesquisa".

Com o visualizador Pesquisar, é possível escrever e executar consultas SQL personalizadas em rastreamentos do Perfetto, além de acessar consultas recentes e salvas. O Winscope oferece visualizações SQL especializadas para ajudar na pesquisa de rastreamentos do SurfaceFlinger, de transações, de transições e de captura de visualização.

Use as seguintes convenções em todas as visualizações:

  • Para as colunas property e flat_property:

    • Os nomes das propriedades estão em snake case, por exemplo, visible_region de LayerProto.
    • Uma notação de ponto representa propriedades aninhadas, por exemplo, visible_region.rect.

    • Os campos repetidos em property são diferenciados com colchetes:

      Por exemplo, em duas instâncias do campo repetido visible_region.rect, o campo top é representado por visible_region.rect[0].top e visible_region.rect[1].top.

    • Campos repetidos em flat_property são indistinguíveis:

      Por exemplo, em duas instâncias do campo repetido visible_region.rect, o campo top é representado por visible_region.rect.top nas duas instâncias.

  • Para as colunas value e previous_value, os valores booleanos são representados por 0 (False) ou 1 (True).

O Winscope cria essas visualizações combinando dados de tabelas específicas do rastreamento com a tabela args do Perfetto. É possível consultar essas tabelas diretamente. Na tabela args, as colunas key, flat_key e display_value são análogas às colunas de visualização property, flat_property e value, respectivamente.

Tabela args:

Coluna Descrição
arg_set_id Usado para associar um conjunto de argumentos.
flat_key Nome da propriedade da mensagem proto, sem considerar campos repetidos
key Nome da propriedade da mensagem proto, considerando campos repetidos
value_type Tipo de valor da propriedade
int_value Valor da propriedade se o tipo de valor for um número inteiro
string_value Valor da propriedade se o tipo de valor for uma string
real_value Valor da propriedade se o tipo de valor for real
display_value Conversão do valor da propriedade para string

Visualizações SQL do SurfaceFlinger

Os dados do proto do SurfaceFlinger usam estes formatos:

Para pesquisar dados de camada, use a visualização sf_layer_search. Essa visualização inclui as seguintes colunas:

Coluna Descrição
state_id ID da linha da entrada a que a camada pertence.
ts Carimbo de data/hora da entrada a que a camada pertence
layer_id ID da camada
parent_id ID da camada do elemento principal
layer_name Nome da camada
property Nome da propriedade que considera campos repetidos
flat_property Nome da propriedade não considerando campos repetidos
value Valor da propriedade no formato de string
previous_value Valor da propriedade da entrada anterior em formato de string

Para pesquisar dados da raiz da hierarquia, use a visualização sf_hierarchy_root_search. Essa visualização inclui as seguintes colunas:

Coluna Descrição
state_id ID da linha da entrada
ts Carimbo de data/hora da entrada
property Nome da propriedade que considera campos repetidos
flat_property Nome da propriedade não considerando campos repetidos
value Valor da propriedade no formato de string
previous_value Valor da propriedade da entrada anterior em formato de string

Exemplos de consultas

  • Encontre todos os frames em que a camada IME tem limites de tela válidos:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Encontre todos os frames em que a camada Taskbar color.a (alfa) muda:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Encontre todos os frames em que o limite inferior de Wallpaper é menor ou igual a 2400:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • Liste todas as propriedades para telas com uma pilha de camadas válida:

    SELECT STATE.* FROM sf_hierarchy_root_search STATE_WITH_DISPLAY_ON
    INNER JOIN sf_hierarchy_root_search STATE
      ON STATE.state_id = STATE_WITH_DISPLAY_ON.state_id
      AND STATE_WITH_DISPLAY_ON.flat_property='displays.layer_stack'
      AND STATE_WITH_DISPLAY_ON.value!='4294967295'
      AND STATE.property LIKE CONCAT(
        SUBSTRING(
            STATE_WITH_DISPLAY_ON.property,
            0,
            instr(STATE_WITH_DISPLAY_ON.property, ']')
        ),
        '%'
      )
    
  • Encontrar todos os frames em que o gesto de deslizar para trás está visível

    SELECT DISTINCT STATE.ts FROM sf_layer_search STATE
      WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
    

Tabelas de dados

As visualizações do SurfaceFlinger são criadas usando as seguintes tabelas subjacentes.

surfaceflinger_layers_snapshot:

Coluna Descrição
id ID da linha da entrada
ts Carimbo de data/hora da entrada
arg_set_id ID usado para associar linhas da tabela args a esta entrada.

surfaceflinger_layer:

Coluna Descrição
id ID da linha da camada
snapshot_id ID da linha da entrada de surfaceflinger_layers_snapshot a que a camada pertence
arg_set_id ID usado para associar linhas da tabela args a essa camada.

Visualização SQL de transações

Os dados do proto de transações usam o formato TransactionTraceEntry.

Para pesquisar dados de rastreamento de transações, use a visualização transactions_search. Essa visualização inclui estas colunas:

Coluna Descrição
state_id ID da linha da entrada a que a propriedade proto pertence
ts Carimbo de data/hora da entrada a que a propriedade proto pertence.
transaction_id ID da transação, se disponível
property Nome da propriedade que considera campos repetidos
flat_property Nome da propriedade não considerando campos repetidos
value Valor da propriedade no formato de string

Exemplos de consultas

  • Encontre o frame em que uma transação foi aplicada para mudar a posição x da camada para -54,0:

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • Encontre o frame em que a camada ImeContainer foi adicionada:

    SELECT ts FROM transactions_search
      WHERE flat_property='added_layers.name'
      AND value='ImeContainer'
    

Tabelas de dados

A visualização SQL "Transações" é criada usando as seguintes tabelas subjacentes.

surfaceflinger_transactions:

Coluna Descrição
id ID da linha da entrada
ts Carimbo de data/hora da entrada
arg_set_id ID usado para associar linhas da tabela args a esta entrada.
vsync_id ID do VSync associado a todas as transações nesta entrada.

android_surfaceflinger_transaction:

Coluna Descrição
id ID da linha da transação
snapshot_id ID da linha da entrada de surfaceflinger_transactions a que a transação pertence
arg_set_id ID usado para associar linhas da tabela args a esta transação.
transaction_id ID da transação extraído da mensagem proto
pid PID da transação extraído da mensagem proto
uid UID da transação extraído da mensagem proto
layer_id ID da camada associada à transação, se aplicável
display_id ID da exibição associada à transação, se aplicável
flags_id ID usado para recuperar flags associadas de android_surfaceflinger_transaction_flag.
transaction_type Tipo de transação

android_surfaceflinger_transaction_flag:

Coluna Descrição
flags_id Corresponde ao valor em uma linha em android_surfaceflinger_transaction
flag String de flag traduzida

As transações individuais são adicionadas à tabela "args" de diferentes formatos de mensagens proto com base no tipo de transação:

  • LAYER_ADDED: formato LayerCreationArgs
  • LAYER_CHANGED: formato LayerState
  • DISPLAY_ADDED: formato DisplayState
  • DISPLAY_CHANGED: formato DisplayState
  • LAYER_DESTROYED: sem argumentos
  • LAYER_HANDLE_DESTROYED: sem argumentos
  • DISPLAY_REMOVED: sem argumentos
  • NOOP: sem argumentos

Visualização SQL de transições

Os dados proto de transições usam o formato ShellTransition.

Para pesquisar dados de transições, use a visualização transitions_search. Essa visualização inclui estas colunas:

Coluna Descrição
ts Horário de envio. Se disponível, volta para o horário de envio. Caso contrário, 0.
transition_id ID de transição extraído da mensagem proto
property Nome da propriedade que considera campos repetidos
flat_property Nome da propriedade não considerando campos repetidos
value UID da transação extraído da mensagem proto

Exemplos de consultas

Encontre propriedades de transições processadas pelo DefaultMixedHandler:

  SELECT
    PROPS.ts,
    PROPS.transition_id,
    PROPS.property,
    PROPS.value
  FROM transitions_search HANDLER_MATCH
  INNER JOIN transitions_search PROPS
    ON HANDLER_MATCH.transition_id = PROPS.transition_id
  WHERE HANDLER_MATCH.property = 'handler'
    AND HANDLER_MATCH.value LIKE "%DefaultMixedHandler"
  ORDER BY PROPS.transition_id, PROPS.property

Tabelas de dados

A visualização "Transições" é criada usando as seguintes tabelas subjacentes.

window_manager_shell_transitions:

Coluna Descrição
id ID da linha para a transição
ts Horário de envio. Se disponível, volta para o horário de envio. Caso contrário, 0.
transition_id ID de transição extraído da mensagem proto
arg_set_id ID usado para associar linhas da tabela args a essa transição.
transition_type Tipo de transição extraído da mensagem proto
send_time_ns Tempo de envio da transição extraído da mensagem proto
dispatch_time_ns Tempo de envio da transição extraído da mensagem proto
duration_ns Duração da transição, se os horários de início e término estiverem disponíveis
handler Processador de transição: extrair a tradução de window_manager_shell_transition_handlers
status Status da transição: played, merged ou aborted
flags Flags de transição extraídas da mensagem proto

window_manager_shell_transition_handlers:

Coluna Descrição
handler_id ID correspondente ao valor na coluna handler de window_manager_shell_transitions
handler_name Tradução de strings

android_window_manager_shell_transition_participants:

Coluna Descrição
transition_id ID da transição extraído da mensagem proto bruta
layer_id ID do participante da camada SurfaceFlinger.
window_id ID do participante do contêiner do WindowManager

Visualização SQL ViewCapture

Os dados do proto ViewCapture usam o formato View.

Para pesquisar dados do ViewCapture, use a visualização viewcapture_search. Essa visualização inclui estas colunas:

Coluna Descrição
state_id ID da linha do estado a que a visualização pertence
ts Carimbo de data/hora do estado a que a visualização pertence
package_name Nome do pacote
window_name Nome da janela
class_name Ver o nome da turma
property Nome da propriedade que considera campos repetidos
flat_property Nome da propriedade não considerando campos repetidos
value Valor da propriedade no formato de string
previous_value Valor da propriedade do estado anterior no formato de string

Exemplos de consultas

Encontre todos os estados quando SearchContainerView se moveu na direção y:

  SELECT * FROM viewcapture_search
  WHERE class_name LIKE '%SearchContainerView'
    AND flat_property='translation_y'
    AND value!=previous_value

Tabelas de dados

A visualização ViewCapture é criada usando as seguintes tabelas subjacentes.

android_viewcapture:

Coluna Descrição
id ID da linha da entrada
ts Carimbo de data/hora da entrada
arg_set_id ID usado para associar linhas da tabela args a esta entrada.

android_viewcapture_view:

Coluna Descrição
id ID da linha da visualização
snapshot_id ID da linha da entrada de android_viewcapture a que a visualização pertence
arg_set_id ID usado para associar linhas da tabela args a esta visualização.

Tabela SQL do ProtoLog

Os dados do proto ProtoLog usam o formato ProtoLogMessage. Essa visualização inclui as seguintes colunas:

Coluna Descrição
ts Carimbo de data/hora do registro
level Nível de registro
tag Tag do grupo de registros
message Mensagem de registro
stacktrace Stack trace (se disponível)
location Localização do código de origem da mensagem

Exemplos de consultas

  • Encontre todos os registros com uma mensagem que contenha transition:

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • Encontre todos os registros que contêm IDs de transação válidos:

    CREATE PERFETTO VIEW valid_tx_ids AS
      SELECT DISTINCT transaction_id FROM transactions_search
      WHERE transaction_id IS NOT NULL AND transaction_id != '0';
    
    SELECT TRANS.transaction_id, message FROM valid_tx_ids TRANS
    INNER JOIN protolog LOGS
      ON LOGS.message LIKE CONCAT('%', TRANS.transaction_id, '%');
    

Executar consultas

Você pode executar consultas de pesquisa usando o painel PESQUISA GLOBAL à esquerda do visualizador Pesquisa.

Quando você interage pela primeira vez com o painel PESQUISA GLOBAL, a pesquisa de rastreamento é inicializada, e o Winscope cria as visualizações SQL auxiliares. Isso leva alguns segundos. Enquanto a pesquisa de rastreamento é inicializada, a linha do tempo não está disponível.

Para iniciar uma consulta, escreva na caixa de pesquisa e clique em Executar consulta de pesquisa ou pressione Enter no teclado.

Quando terminar, a tabela de resultados vai aparecer no painel do meio. Sua consulta aparece abaixo da caixa de pesquisa, com um campo para salvar a consulta entre as sessões.

Para acessar as consultas salvas, clique na guia Salvas no painel à esquerda. Para acessar as consultas executadas recentemente, clique na guia Recentes:

painel esquerdo do visualizador de pesquisa

Figura 2. Painel esquerdo do visualizador de pesquisa.

Resultados

Todas as consultas retornam resultados tabulados, mostrados em uma visualização rolável com comportamento interativo semelhante aos visualizadores de rastreamento baseados em registros, como Transações e ProtoLog:

resultados do visualizador de pesquisa

Figura 3. Resultados do visualizador de pesquisa.

Se a tabela resultante tiver uma coluna ts, os valores dela serão interpretados como carimbos de data/hora e adicionados à sobreposição da linha do tempo como uma nova linha de entradas. Clique nesta linha e use as setas para a esquerda e para a direita para navegar entre as entradas:

linha do tempo de pesquisa

Figura 4. Linha do tempo de pesquisa.