Esegui query sui profili con PerfettoSQL

Puoi eseguire query sui profili ProfilingManager utilizzando PerfettoSQL e i moduli della libreria standard di Perfetto. Poiché ProfilingManager oscura il tracciamento del sistema in modo da includere solo i dati di processo della tua app, le query della libreria standard a livello di sistema che dipendono da altri processi non sono supportate. Tuttavia, la maggior parte delle query con ambito app e dei moduli della libreria standard funziona senza modifiche. Per altre query pronte all'uso, consulta Analisi delle tracce Android.

Query di esempio di ProfilingManager

Utilizza le seguenti query di esempio direttamente o come modelli per la tua analisi PerfettoSQL.

Trova le sezioni più duplicate

Le sezioni ripetute spesso indicano un lavoro ridondante. Per i dettagli sulla sintassi delle funzioni, consulta Definizione delle funzioni in PerfettoSQL. La seguente query definisce una funzione PerfettoSQL riutilizzabile che trova le sezioni corrispondenti a un pattern GLOB e le ordina in base alla frequenza:

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

Query con jank

Utilizza le seguenti query per identificare i frame lenti o instabili in un tracciamento del sistema.

Trova i frame lenti

Questa query trova i frame che richiedono più di 16,6 ms (60 Hz) per il rendering. Poiché Perfetto memorizza le durate delle sezioni in nanosecondi, dur viene confrontato con 16660000:

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

Trova i frame che causano jank

Questa query utilizza il modulo della cronologia dei frame per trovare i frame in cui l'app non ha rispettato la scadenza di rendering in base alla frequenza di aggiornamento del dispositivo:

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

Trova gli oggetti più duplicati

In un dump dell'heap Java, questa query restituisce le prime 100 classi con due o più istanze per aiutarti a individuare duplicati involontari o opportunità di memorizzazione nella cache:

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

Latenza di avvio a freddo

Questa query stima il tempo per il primo frame (TTFF) dell'avvio a freddo misurando la durata tra bindApplication e la prima sezione 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)