L'esecuzione di query sui profili ProfilingManager è simile all'esecuzione di query sui profili Perfetto
standard. Pertanto, consulta la guida introduttiva a PerfettoSQL per scoprire come eseguire query sui profili.
Una distinzione importante tra le normali tracce Perfetto e le tracce ProfilingManager
è che le tracce ProfilingManager passano attraverso un editor di tracce. Questo
redattore rimuove le informazioni su altri processi non correlati alla tua app per
motivi di privacy.
Alcune query della libreria standard Perfetto non sono utilizzabili nelle tracce
modificate. Questo perché ProfilingManager raccoglie solo i dati di profilazione per la tua
app, non per altri processi. Di conseguenza, le query che puoi utilizzare con
ProfilingManager sono un insieme più piccolo rispetto a quelle per i profili di sistema completi
registrati utilizzando Perfetto locale.
Anche se lo spazio delle query è ridotto, puoi comunque utilizzare molte query e tabelle PerfettoSQL della libreria standard Perfetto così come sono, quindi ti consigliamo di provarle.
Ti consigliamo inoltre di consultare la sezione Analisi delle tracce Android per trovare query pronte all'uso che forniscono dati utili sul rendimento senza modifiche.
Query di esempio di ProfilingManager
Per semplificare il percorso di query, questa sezione fornisce un elenco di query che
funzionano con ProfilingManager. Puoi utilizzare queste query direttamente o come esempi
per creare altre query.
Trovare le fette più duplicate
Questa query trova le sezioni ripetute in una traccia e le ordina in base alla frequenza con cui vengono visualizzate, mostrando prima quelle più duplicate.
La ricerca di lavoro duplicato è un modo comune per trovare lavoro non necessario in una traccia.
-- 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*')
Query jank
Trovare i frame lenti
Questa query trova i frame in cui la tua app impiega troppo tempo per generare un frame,
supponendo una frequenza fotogrammi prevista di 60 Hz (16,6 ms). Il valore dur è impostato su
16.660.000 perché le durate delle sezioni nelle tabelle Perfetto sono memorizzate in nanosecondi.
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
Trovare i frame che causano jank
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';
Questa query è utile per trovare le posizioni in cui si verifica jank nella traccia perché l'app impiega troppo tempo per generare un frame. Ciò significa che il thread UI non è riuscito a generare un frame. In circostanze estreme, questo potrebbe precedere un errore ANR.
Trovare gli oggetti più duplicati
Puoi anche eseguire query sui profili correlati alla memoria, come i dump dell'heap, per eseguire analisi della memoria più complesse.
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
Questa query restituisce i 100 oggetti duplicati più popolari. Questo può aiutarti a trovare oggetti istanziati più volte, il che potrebbe rivelare opportunità per memorizzarli nella cache o identificare duplicati non intenzionali.
Latenza di avvio a freddo
Puoi anche eseguire query per le startup. Questa sezione fornisce una query più elaborata per stimare il tempo di avvio a freddo in una traccia.
-- 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)
Questa query genera una sezione che rappresenta il tempo tra due sezioni che
definiscono il tempo di avvio: bindApplication (in genere si trova all'inizio di un
avvio a freddo dell'app) e la prima sezione Choreographer#doFrame (il primo
frame generato). Questa metrica stima in modo efficace il TTFF (time to first frame) dell'avvio a freddo.