L'esecuzione di query sui profili ProfilingManager è simile all'esecuzione di query sui profili Perfetto
normali. Pertanto, consulta Introduzione a PerfettoSQL per una guida su come eseguire query sui profili.
Una distinzione importante tra le normali tracce Perfetto e le tracce ProfilingManager è che le tracce ProfilingManager passano attraverso un redattore di tracce. Questo redattore rimuove le informazioni su altri processi non correlati alla tua app per motivi di privacy.
Alcune query della libreria standard di Perfetto non sono utilizzabili su tracce oscurate. Questo accade perché ProfilingManager raccoglie i dati di profilazione solo 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 per le query è ridotto, puoi comunque utilizzare molte query e tabelle PerfettoSQL della libreria standard di Perfetto così come sono, quindi ti invitiamo a provarle.
Ti consigliamo inoltre di consultare la sezione Analisi delle tracce Android per trovare query pronte all'uso che forniscono dati sul rendimento utili 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.
Trova le sezioni 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 con jank
Trova i frame lenti
Questa query trova i frame in cui l'app impiega troppo tempo per generare un frame,
supponendo una frequenza fotogrammi prevista di 60 Hz (16,6 ms). 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;
Trova 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 un jank nella traccia perché l'app impiega troppo tempo per generare un frame. Ciò significa che il thread dell'interfaccia utente non è riuscito a generare un frame. In circostanze estreme, questo potrebbe precedere un errore ANR.
Trova gli oggetti più duplicati
Puoi anche eseguire query sui profili relativi 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 primi 100 oggetti duplicati. In questo modo puoi trovare gli oggetti di cui vengono create più istanze, il che potrebbe rivelare opportunità per memorizzarli nella cache o identificare duplicati indesiderati.
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 (che 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.