Crea perfiles de Query ProfilingManager

Las consultas de perfiles de ProfilingManager son similares a las de perfiles de Perfetto normales. Por lo tanto, consulta Comienza a usar PerfettoSQL para obtener una guía sobre cómo consultar perfiles.

Una distinción importante entre los registros de Perfetto normales y los registros de ProfilingManager es que los registros de ProfilingManager pasan por un redactor de registros. Este redactor quita información sobre otros procesos no relacionados con tu app por motivos de privacidad.

Algunas consultas de la biblioteca estándar de Perfetto no se pueden usar en registros ocultos. Esto se debe a que ProfilingManager solo recopila datos de generación de perfiles para tu app, no para otros procesos. Como resultado, las consultas que puedes usar con ProfilingManager son un conjunto más pequeño que las de los perfiles completos del sistema que se registran con Perfetto local.

Aunque el espacio de consultas se reduce, puedes seguir usando muchas consultas y tablas de PerfettoSQL de la biblioteca estándar de Perfetto tal como están, por lo que te recomendamos que las pruebes.

También te recomendamos que revises Cómo analizar registros de Android para encontrar consultas listas para usar que proporcionen datos de rendimiento útiles sin modificaciones.

Consultas de muestra de ProfilingManager

Para simplificar el proceso de consultas, en esta sección, se proporciona una lista de consultas que funcionan con ProfilingManager. Puedes usar estas consultas directamente o como ejemplos para crear otras.

Cómo encontrar los segmentos más duplicados

Esta consulta encuentra segmentos repetidos en un registro y los ordena según la frecuencia con la que aparecen, mostrando primero los más duplicados.

Encontrar trabajo duplicado es una forma común de encontrar trabajo innecesario en un registro.

-- 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 bloqueos

Cómo encontrar fotogramas lentos

Esta consulta busca los fotogramas en los que tu app tarda demasiado en generar un fotograma, suponiendo una velocidad de fotogramas esperada de 60 Hz (16.6 ms). El valor de dur se establece en 16,660,000 porque las duraciones de los segmentos en las tablas de Perfetto se almacenan en nanosegundos.

INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;

Cómo encontrar fotogramas que causan bloqueos

INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';

Esta consulta es útil para encontrar ubicaciones en las que se producen bloqueos en el registro porque la app tarda demasiado en generar un fotograma. Esto significa que el subproceso de IU no pudo generar un fotograma. En situaciones extremas, esto podría preceder a un ANR.

Encuentra los objetos más duplicados

También puedes consultar perfiles relacionados con la memoria, como los volcados de montón, para realizar análisis de memoria más complejos.

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

Esta consulta devuelve los 100 objetos duplicados principales. Esto puede ayudarte a encontrar objetos que se crean instancias varias veces, lo que podría revelar oportunidades para almacenarlos en caché o identificar duplicados no deseados.

Latencia de inicio en frío

También puedes buscar startups. En esta sección, se proporciona una consulta más elaborada para estimar el tiempo de inicio en frío en un registro.

-- 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)

Esta consulta genera un segmento que representa el tiempo entre dos segmentos que definen el tiempo de inicio: bindApplication (que se suele encontrar al inicio del lanzamiento en frío de una app) y el primer segmento Choreographer#doFrame (el primer fotograma generado). Esta métrica estima de manera eficaz el TTFF (tiempo hasta el primer fotograma) del inicio en frío.