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)