Puedes consultar perfiles de ProfilingManager con PerfettoSQL y módulos
de la biblioteca estándar de Perfetto. Debido a que ProfilingManager oculta los registros del sistema para incluir solo los datos del proceso de tu app, no se admiten las consultas de la biblioteca estándar de todo el sistema que dependen de otros procesos. Sin embargo, la mayoría de las consultas con alcance de app y los módulos de biblioteca estándar funcionan sin modificaciones. Para
obtener consultas adicionales listas para usar, consulta Analiza seguimientos de Android.
Consultas de ejemplo de ProfilingManager
Usa las siguientes consultas de ejemplo directamente o como plantillas para tu propio análisis de PerfettoSQL.
Encuentra los segmentos más duplicados
Los segmentos repetidos suelen indicar trabajo redundante. Para obtener detalles sobre la sintaxis de las funciones,
consulta Cómo definir funciones en PerfettoSQL. La siguiente consulta define una
función de PerfettoSQL reutilizable que encuentra porciones que coinciden con un patrón GLOB y
las ordena por frecuencia:
-- You only need to call this once in the session to create or update the function
CREATE OR REPLACE 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 bloqueos
Usa las siguientes consultas para identificar fotogramas lentos o con bloqueos en un seguimiento del sistema.
Cómo encontrar fotogramas lentos
Esta consulta busca fotogramas que tardan más de 16.6 ms (60 Hz) en renderizarse. Debido a que Perfetto almacena las duraciones de los segmentos en nanosegundos, dur se compara con 16660000:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
Cómo encontrar fotogramas que causan bloqueos
Esta consulta usa el módulo de cronograma de fotogramas para encontrar fotogramas en los que la app no cumplió con el plazo de renderización según la frecuencia de actualización del dispositivo:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type GLOB '*App Deadline Missed*';
Encuentra los objetos más duplicados
En un volcado de montón de Java, esta consulta devuelve las 100 clases principales con dos o más instancias para ayudarte a detectar duplicados no deseados o posibles oportunidades de almacenamiento en caché:
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
Latencia de inicio en frío
Esta consulta estima el tiempo de inicio en frío hasta el primer fotograma (TTFF) midiendo la duración entre bindApplication y el primer segmento Choreographer#doFrame:
-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE PERFETTO 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)