Sie können ProfilingManager-Profile mit PerfettoSQL und Modulen aus der Perfetto-Standardbibliothek abfragen. Da ProfilingManager System-Traces so entfernt, dass nur die Prozessdaten Ihrer App enthalten sind, werden systemweite Standardbibliotheksabfragen, die von anderen Prozessen abhängen, nicht unterstützt. Die meisten anwendungsspezifischen Abfragen und Standardbibliotheksmodule funktionieren jedoch ohne Änderungen. Weitere sofort einsetzbare Abfragen finden Sie unter Android-Traces analysieren.
Beispielabfragen für ProfilingManager
Sie können die folgenden Beispielabfragen direkt oder als Vorlagen für Ihre eigene PerfettoSQL-Analyse verwenden.
Die am häufigsten duplizierten Segmente finden
Wiederholte Segmente weisen oft auf redundante Arbeit hin. Weitere Informationen zur Funktionssyntax finden Sie unter Funktionen in PerfettoSQL definieren. In der folgenden Abfrage wird eine wiederverwendbare PerfettoSQL-Funktion definiert, die Slices findet, die einem GLOB-Muster entsprechen, und sie nach Häufigkeit sortiert:
-- 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*')
Abfragen zu Rucklern
Verwenden Sie die folgenden Abfragen, um langsame oder ruckelige Frames in einem System-Trace zu identifizieren.
Langsame Frames finden
Mit dieser Abfrage werden Frames gefunden, deren Rendering länger als 16,6 ms (60 Hz) dauert. Da Perfetto Slice-Dauern in Nanosekunden speichert, wird dur mit 16660000 verglichen:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
Frames finden, die Ruckeln verursachen
In dieser Abfrage wird das Frame-Zeitachsenmodul verwendet, um Frames zu finden, bei denen die App die Rendering-Frist gemäß der Aktualisierungsrate des Geräts verpasst hat:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type GLOB '*App Deadline Missed*';
Am häufigsten duplizierte Objekte finden
In einem Java-Heap-Dump gibt diese Abfrage die 100 Klassen mit zwei oder mehr Instanzen zurück, um Ihnen zu helfen, unbeabsichtigte Duplikate oder Caching-Möglichkeiten zu finden:
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
Kaltstartlatenz
Mit dieser Abfrage wird die Zeit bis zum ersten Frame (TTFF) beim Kaltstart geschätzt. Dazu wird die Dauer zwischen bindApplication und dem ersten Choreographer#doFrame-Slice gemessen:
-- 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)