Consultar perfis ProfilingManager é semelhante a consultar perfis regulares do Perfetto. Portanto, consulte Como começar a usar o PerfettoSQL para um guia sobre
como consultar perfis.
Uma distinção importante entre rastreamentos regulares do Perfetto e rastreamentos ProfilingManager é que os rastreamentos ProfilingManager passam por um redator de rastreamento. Esse
redator remove informações sobre outros processos não relacionados ao seu app por
motivos de privacidade.
Algumas consultas da biblioteca padrão do Perfetto não podem ser usadas em rastreamentos
redigidos. Isso acontece porque o ProfilingManager coleta apenas dados de criação de perfil do seu
app, e não de outros processos. Como resultado, as consultas que você pode usar com
ProfilingManager são um conjunto menor do que as de perfis completos do sistema
gravados usando o Perfetto local.
Mesmo que o espaço de consulta seja reduzido, ainda é possível usar muitas consultas e tabelas do PerfettoSQL da Biblioteca padrão do Perfetto como estão. Por isso, recomendamos que você as teste.
Também recomendamos que você analise Como analisar rastreamentos do Android para encontrar consultas prontas para uso que fornecem dados de performance úteis sem modificação.
Consultas de amostra do ProfilingManager
Para simplificar a jornada de consultas, esta seção fornece uma lista de consultas que funcionam com ProfilingManager. Você pode usar essas consultas diretamente ou como exemplos para criar outras.
Encontrar as fatias mais duplicadas
Essa consulta encontra intervalos repetidos em um rastreamento e os classifica de acordo com a frequência em que aparecem, mostrando primeiro os mais duplicados.
Encontrar trabalho duplicado é uma maneira comum de encontrar trabalho desnecessário em um rastreamento.
-- You only need to call this once in the session to create the function
DROP TABLE IF EXISTS find_duplicates;
CREATE PERFETTO FUNCTION find_duplicates(pattern STRING) RETURNS
TABLE(name STRING, count_slice LONG) AS SELECT name, COUNT(dur) as count_slice FROM slice WHERE name GLOB $pattern GROUP BY name HAVING COUNT(name) >= 2 ORDER BY count_slice DESC;
-- Subsequent calls can just use the function to find dupes
SELECT * FROM find_duplicates('*Text*')
Consultas de instabilidade
Encontrar frames lentos
Essa consulta encontra frames em que o app leva muito tempo para gerar um frame, considerando uma taxa de frames esperada de 60 Hz (16,6 ms). O dur é definido como 16.660.000 porque as durações de intervalos nas tabelas do Perfetto são armazenadas em nanossegundos.
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
Encontrar frames que causam instabilidade
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';
Essa consulta é útil para encontrar locais em que a instabilidade ocorre no rastreamento porque o app leva muito tempo para gerar um frame. Isso significa que a linha de execução da UI não conseguiu gerar um frame. Em circunstâncias extremas, isso pode preceder um ANR.
Encontrar os objetos mais duplicados
Você também pode consultar perfis relacionados à memória, como despejos de heap, para realizar análises de memória mais complexas.
INCLUDE PERFETTO MODULE android.memory.heap_graph.heap_graph_class_aggregation;
SELECT * FROM android_heap_graph_class_aggregation WHERE obj_count >= 2
ORDER BY obj_count DESC LIMIT 100
Essa consulta retorna os 100 principais objetos duplicados. Isso pode ajudar você a encontrar objetos instanciados várias vezes, o que pode revelar oportunidades de armazená-los em cache ou identificar duplicatas não intencionais.
Latência de inicialização a frio
Você também pode consultar startups. Esta seção fornece uma consulta mais elaborada para estimar o tempo de inicialização a frio em um rastreamento.
-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;
-- This function generates a slice that starts at $startSlicePattern and finishes at the slice matched by $endSlicePattern. If $inclusive is true, then the end slice dur will be added, otherwise, the end slice start time will be used.
CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
(SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
WHERE startToEndDur > 0)
GROUP BY name, ts;
-- Using these functions we can estimate cold startup time by generating a slice between bindApplication and first frame.
SELECT * from generate_start_to_end_slices('bindApplication','*Choreographer#doFrame [0-9]*', true)
Essa consulta gera uma fatia que representa o tempo entre duas fatias que definem o tempo de inicialização: bindApplication (geralmente encontrado no início de uma inicialização a frio do app) e a primeira fatia Choreographer#doFrame (o primeiro frame gerado). Essa métrica estima de forma eficaz o TTFF (tempo até o primeiro frame) de inicialização a frio.