Profile in der Perfetto-Benutzeroberfläche visualisieren

Nachdem Sie ein Profil von einem Testgerät abgerufen oder von Ihrem Backend heruntergeladen haben, können Sie die Datei in der Perfetto-Benutzeroberfläche öffnen, um Zeitachsen, Thread-Status und Diagramme zur Speicherbelegung zu prüfen. Auf dieser Seite wird beschrieben, wie Sie in entfernten System-Traces und Java-Heap-Dumps navigieren, die mit ProfilingManager erfasst wurden.

System-Traces visualisieren

Öffnen Sie die Datei .perfetto-trace in der Perfetto-Benutzeroberfläche, um die CPU- und Thread-Aktivität im Zeitverlauf zu prüfen.

Zeitachse eines bearbeiteten System-Trace in der Perfetto-UI
Abbildung 1. Beispiel für einen bearbeiteten Trace.

Zum Schutz des Datenschutzes der Nutzer werden System-Traces in ProfilingManager entfernt, indem die CPU-Aktivität aller anderen Prozesse in einem einzigen OtherProcesses-Track zusammengefasst wird. Anhand dieses kombinierten Tracks können Sie immer noch feststellen, ob die Langsamkeit Ihrer App durch einen internen Engpass oder die allgemeine Gerätelast verursacht wurde.

In Abbildung 2 sind die Hauptabschnitte eines bearbeiteten System-Trace hervorgehoben:

Nummerierte Abschnitte eines bearbeiteten System-Trace in der Perfetto-Benutzeroberfläche
Abbildung 2: Abschnitte eines bearbeiteten Trace.
  1. CPU-Liste: Zeigt alle auf Ihrem Gerät verfügbaren Prozessoren an.
  2. CPU-Aufgaben: Zeigt, welche Threads von den einzelnen CPUs ausgeführt wurden.
  3. Ansicht „Andere Prozesse“: Zeigt die von anderen Prozessen verbrauchten CPU-Ressourcen an.
  4. Prozessansicht: Zeigt den Prozess Ihrer App an.
  5. Thread-Ansicht: Zeigt die Threads an, die in Ihrem Prozess ausgeführt werden, und deren Thread-Status (Ausführbar (R), Wird ausgeführt (R), Ruhezustand (S), Nicht unterbrechbarer Ruhezustand (D)), die direkt den Linux-Prozessstatus zugeordnet werden.
  6. Trace-Slices: In diesem Abschnitt werden Trace-Annotationen angezeigt, die von App-Entwicklern oder dem Framework hinzugefügt wurden. Diese Annotationen umfassen Berechnungen zwischen Trace.beginSection und Trace.endSection.

Weitere Informationen zur Perfetto-Benutzeroberfläche und zur Trace-Visualisierung finden Sie in der Perfetto-Dokumentation.

Java-Heap-Dumps visualisieren

Nachdem Sie einen Java-Heap-Dump mit PROFILING_TYPE_JAVA_HEAP_DUMP erfasst haben, öffnen Sie die resultierende .perfetto-java-heap-dump-Datei in der Perfetto-Benutzeroberfläche, um Speicherlecks zu identifizieren oder die Speichernutzung zu optimieren. Im Heapdump Explorer können Sie das Heap-Diagramm untersuchen, Flame-Diagramme der kumulativen Objektgrößen prüfen und Klassen, Objekte und Dominatoren durchsuchen, wie in Abbildung 3 dargestellt.

Perfetto-UI-Heapdump-Explorer mit einem Flame-Diagramm der Java-Heap-Objektgrößen.
Abbildung 3: Flame-Diagramm des Java-Heap-Dumps in der Perfetto-Benutzeroberfläche

Unterschiede zwischen ProfilingManager-Heap-Dumps und HPROF-Dumps

Im Gegensatz zu standardmäßigen .hprof-Heap-Dumps (z. B. mit Debug.dumpHprofData oder in Android Studio erfassten) erfasst ProfilingManager einen Perfetto ART-Heap-Dump (.perfetto-java-heap-dump). Anstatt Rohspeicherinhalte zu sichern, zeichnet ProfilingManager die Objektbeibehaltungsgrafik und die Größenmetadaten auf, während die in Objekten gespeicherten Rohdaten weggelassen werden:

  • Welche Daten werden erhoben?:
    • Klassen und Typen: Klassennamen, Basisklassenhierarchien, Classloader, Instanzgrößen und Referenztypen (z. B. normale Klassen, Arrays, Strings oder schwache, weiche, Finalizer- und Phantomreferenzen).
    • Objektinstanzen und -größen: Die flache Größe jedes Objekts (self_size), seine Heap-Region (HEAP_TYPE_APP, HEAP_TYPE_ZYGOTE oder HEAP_TYPE_BOOT_IMAGE) und der zugehörige native Speicher, der über NativeAllocationRegistry registriert wurde.
    • Referenzen und GC-Roots: Garbage-Collection-Roots (z. B. JNI-Globals und -Locals, Java-Stapelframes und Thread-Objekte) und Referenzketten auf Feldebene, die zeigen, welches Objekt ein anderes Objekt beibehält und über welchen Feldnamen.
    • Größenmetadaten auswählen: Nicht vertrauliche Metadaten für bestimmte Framework-Typen, z. B. Bitmap-Dimensionen (mWidth und mHeight).
  • Was weggelassen wird: Tatsächliche primitive Feldwerte, String-Zeicheninhalte und Roh-Array-Nutzlasten (byte[], char[] und andere primitive Arrays). Durch das Weglassen von Rohobjektinhalten wird der Datenschutz (für Nutzer) auf Produktionsgeräten geschützt und die Dump-Dateien bleiben deutlich kleiner.

Nächste Schritte

Neben der visuellen Prüfung in der Perfetto-Benutzeroberfläche können Sie Profile mit PerfettoSQL abfragen, Traces im Bulk analysieren oder Profile mit KI analysieren.