Profil für Query ProfilingManager abfragen

Das Abfragen von ProfilingManager-Profilen ähnelt dem Abfragen regulärer Perfetto-Profile. Lesen Sie daher den Leitfaden Erste Schritte mit PerfettoSQL, um zu erfahren, wie Sie Profile abfragen.

Ein wichtiger Unterschied zwischen regulären Perfetto-Traces und ProfilingManager-Traces besteht darin, dass ProfilingManager-Traces einen Trace-Redaktor durchlaufen. Dieser Redaktor entfernt aus Datenschutzgründen Informationen zu anderen Prozessen, die nicht mit Ihrer Anwendung zusammenhängen.

Einige Abfragen aus der Perfetto-Standardbibliothek können nicht für entfernte Traces verwendet werden. Das liegt daran, dass ProfilingManager nur Profildaten für Ihre Anwendung und nicht für andere Prozesse erfasst. Daher sind die Abfragen, die Sie mit ProfilingManager verwenden können, eine kleinere Gruppe als die für vollständige Systemprofile, die mit lokalem Perfetto aufgezeichnet wurden.

Auch wenn der Abfragebereich reduziert ist, können Sie viele PerfettoSQL-Abfragen und ‑Tabellen aus der Perfetto-Standardbibliothek unverändert verwenden. Wir empfehlen Ihnen, sie auszuprobieren.

Wir empfehlen außerdem, den Artikel Android-Traces analysieren zu lesen. Dort finden Sie sofort einsatzbereite Abfragen, die ohne Änderungen nützliche Leistungsdaten liefern.

Beispielabfragen für ProfilingManager

In diesem Abschnitt finden Sie eine Liste von Abfragen, die mit ProfilingManager funktionieren, um die Abfrage zu vereinfachen. Sie können diese Abfragen direkt oder als Beispiele für andere Abfragen verwenden.

Die am häufigsten duplizierten Segmente finden

Mit dieser Abfrage werden wiederholte Slices in einem Trace gefunden und nach der Häufigkeit ihres Auftretens sortiert. Die am häufigsten duplizierten Slices werden zuerst angezeigt.

Das Suchen nach doppelten Aufgaben ist eine gängige Methode, um unnötige Aufgaben in einem Trace zu finden.

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

Abfragen zu Rucklern

Langsame Frames finden

Mit dieser Abfrage werden Frames gefunden, bei denen Ihre App zu lange braucht, um einen Frame zu generieren, wobei eine erwartete Framerate von 60 Hz (16,6 ms) angenommen wird. Der Wert dur ist auf 16.660.000 festgelegt, da die Dauer von Slices in Perfetto-Tabellen in Nanosekunden gespeichert wird.

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

Frames finden, die Ruckeln verursachen

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

Diese Abfrage ist nützlich, um Stellen im Trace zu finden, an denen es zu Rucklern kommt, weil die App zu lange braucht, um einen Frame zu generieren. Das bedeutet, dass der UI-Thread keinen Frame generieren konnte. Unter extremen Umständen kann dies zu einem ANR-Fehler führen.

Am häufigsten duplizierte Objekte finden

Sie können auch speicherbezogene Profile wie Heap-Dumps abfragen, um komplexere Speicheranalysen durchzuführen.

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

Diese Abfrage gibt die 100 häufigsten duplizierten Objekte zurück. So können Sie Objekte finden, die mehrmals instanziiert werden. Das kann Ihnen helfen, Möglichkeiten zum Caching zu finden oder unbeabsichtigte Duplikate zu identifizieren.

Kaltstartlatenz

Sie können auch nach Start-ups suchen. In diesem Abschnitt finden Sie eine komplexere Abfrage, mit der Sie die Kaltstartzeit in einem Trace schätzen können.

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

Diese Abfrage generiert einen Slice, der die Zeit zwischen zwei Slices darstellt, die die Startzeit definieren: bindApplication (normalerweise am Anfang eines Kaltstarts der App) und der erste Choreographer#doFrame-Slice (der erste generierte Frame). Mit diesem Messwert wird die TTFF (Time to First Frame) beim Kaltstart effektiv geschätzt.