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:
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
eflat_property
:- Os nomes das propriedades estão em snake case, por exemplo,
visible_region
deLayerProto
. 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 campotop
é representado porvisible_region.rect[0].top
evisible_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 campotop
é representado porvisible_region.rect.top
nas duas instâncias.
- Os nomes das propriedades estão em snake case, por exemplo,
Para as colunas
value
eprevious_value
, os valores booleanos são representados por0
(False
) ou1
(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:
Os dados da camada estão no formato
LayerProto
.Os dados da raiz da hierarquia estão no formato
LayersSnapshotProto
.
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
: formatoLayerCreationArgs
LAYER_CHANGED
: formatoLayerState
DISPLAY_ADDED
: formatoDisplayState
DISPLAY_CHANGED
: formatoDisplayState
LAYER_DESTROYED
: sem argumentosLAYER_HANDLE_DESTROYED
: sem argumentosDISPLAY_REMOVED
: sem argumentosNOOP
: 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:
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:
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:
Figura 4. Linha do tempo de pesquisa.