Unter Android wird die Benutzeroberfläche gerendert, indem ein Frame aus Ihrer App generiert und auf dem Bildschirm angezeigt wird. Wenn die Benutzeroberfläche Ihrer App langsam gerendert wird, muss das System Frames überspringen. In diesem Fall nimmt der Nutzer ein wiederkehrendes Flimmern auf dem Bildschirm wahr, das als Jank bezeichnet wird.
Wenn Verzögerung auftritt, liegt das in der Regel an einem asynchronen Aufruf, der im UI-Thread (in den meisten Apps ist das der Hauptthread) verlangsamt oder blockiert wird. Mithilfe von System-Traces können Sie herausfinden, wo das Problem liegt.
Wenn Sie Jetpack Compose verwenden, können Sie die Rendering-Leistung im Trace am besten untersuchen, indem Sie Composition-Tracing aktivieren. Informationen zu häufigen Leistungsproblemen in Compose finden Sie unter Jetpack Compose-Leistung.
Verwenden Sie für Compose-Apps die Schritte in diesem Leitfaden, wenn Sie einen Überblick über Ihre App benötigen. Die hier vorgestellten System Tracing helfen Ihnen, Verzögerungen zu erkennen, die durch Probleme auf Systemebene verursacht werden, die den Hauptthread blockieren, z. B. intensive Festplatten-E/A, aggressive automatische Speicherbereinigung oder Engpässe beim GPU-Rendering. Verwenden Sie die Anleitung zur Jetpack Compose-Leistung, wenn Sie die Verzögerung auf Ihre UI-Ebene eingegrenzt haben. In diesem Leitfaden erfahren Sie, wie Sie Compose-spezifische Ineffizienzen beheben können, z. B. übermäßige Neukompositionen, das Lesen des Status in der falschen Phase oder die Verwendung instabiler Parameter.
Jank unter Android 12 und höher erkennen
Bei Geräten mit Android 12 (API-Level 31) oder höher wird ein erfasster Trace im CPU Profiler im Bereich Display auf dem Track Janky frames (Ruckelnde Frames) angezeigt.
So erkennen Sie Verzögerungen:
Wählen Sie in Android Studio View > Tool Windows > Profiler (Ansicht > Tool-Fenster > Profiler) aus oder klicken Sie in der Symbolleiste auf Profile
.Wenn Sie im Dialogfeld Select Deployment Target (Bereitstellungsziel auswählen) dazu aufgefordert werden, wählen Sie das Gerät aus, auf dem Ihre App für das Profiling bereitgestellt werden soll. Wenn Sie ein Gerät über USB angeschlossen haben, es aber nicht aufgeführt wird, prüfen Sie, ob Sie USB-Debugging aktiviert haben.
Klicken Sie auf eine beliebige Stelle in der CPU-Zeitachse, um den CPU Profiler zu öffnen.
Wählen Sie im CPU Profiler im Konfigurationsmenü System Trace (System-Trace) aus und klicken Sie auf Record (Aufzeichnen). Wenn Sie die Interaktion mit Ihrer App beendet haben, klicken Sie auf Beenden.
Der Track Janky frames sollte unter Display angezeigt werden. Standardmäßig werden im Profiler nur Frames mit Rucklern als Kandidaten für die Untersuchung angezeigt. Innerhalb jedes ruckeligen Frames wird im roten Bereich die Dauer des Frames nach Ablauf der Rendering-Frist hervorgehoben.

Wenn Sie einen fehlerhaften Frame gefunden haben, klicken Sie darauf. Optional können Sie M drücken, um den Zoom so anzupassen, dass der ausgewählte Frame im Fokus steht. Die relevanten Ereignisse sind in diesen Threads hervorgehoben: dem Hauptthread, RenderThread und GPU completion.

Optional können Sie alle Frames oder eine Aufschlüsselung der Rendering-Zeit sehen, indem Sie die entsprechenden Kästchen Alle Frames und Lebenszyklus aktivieren.

Verzögerung unter Android 11 erkennen
Bei Geräten mit Android 11 (API-Level 30) wird ein erfasster Trace im CPU Profiler im Bereich Frame Lifecycle (Frame-Lebenszyklus) angezeigt.

Der Bereich Frame Lifecycle (Frame-Lebenszyklus) enthält den Layernamen und vier Tracks. Jeder Track steht für eine Phase in der Pipeline für das Rendern von Frames. Die Elemente des Frame-Lebenszyklus sind:
- Frame Lifecycle (Layer name) (Lebenszyklus von Frames (Layernamen)): Der Abschnittstitel enthält den Layernamen in Klammern. Eine Ebene ist eine einzelne Einheit der Komposition.
- Anwendung: Dieser Track zeigt die Zeit von dem Zeitpunkt an, zu dem der Puffer von der App aus der Warteschlange entfernt wurde, bis zu dem Zeitpunkt, zu dem er wieder in die Warteschlange gestellt wurde. Dies entspricht in der Regel den Trace-Ereignissen in
RenderThread. - Auf GPU warten: In diesem Track wird angezeigt, wie lange der Puffer von der GPU verwendet wurde. Dies ist die Zeit, die vergeht, bis die GPU ihre Arbeit am Puffer abgeschlossen hat, nachdem der Puffer an die GPU gesendet wurde. Das bedeutet nicht, dass die GPU in dieser Zeit nur an diesem Puffer gearbeitet hat. Detaillierte Informationen dazu, woran die GPU zu einem bestimmten Zeitpunkt arbeitet, finden Sie im Android GPU Inspector.
- Zusammensetzung: Dieser Track zeigt die Zeit von dem Moment an, in dem SurfaceFlinger den Puffer erfasst und zur Zusammensetzung sendet, bis der Puffer an das Display gesendet wird.
- Angezeigte Frames: Dieser Track zeigt an, wie lange der Frame auf dem Bildschirm zu sehen war.
Im Abschnitt Frame-Lebenszyklus wird veranschaulicht, wie ein Framebuffer zwischen den verschiedenen Phasen der Rendering-Pipeline wechselt. Die Frames sind nach Framenummer farblich codiert, damit sich ein bestimmter Frame leichter verfolgen lässt.
Android Studio zeigt außerdem alle Frames im Trace in Tabellenform auf dem Tab Alle Frames an.

Die Spalten Frame #, Application, Wait for GPU und Composition enthalten dieselben Daten wie die Tracks im Abschnitt Frame Lifecycle oben. Die Spalte Frame Duration (Framedauer) gibt die Zeit vom Start von Application (Anwendung) bis zum Start von Frames on Display (Angezeigte Frames) an. Das ist im Grunde die Zeit, die für das Rendern eines Frames von Anfang bis Ende benötigt wird.
Sie können die Tabelle mit den Frames nach einer beliebigen Spalte sortieren, um schnell den kürzesten oder längsten Frame zu finden. Die Tabelle unterstützt auch Paginierungssteuerelemente, mit denen Sie durch Hunderte von Frames navigieren können.
So erkennen und untersuchen Sie Verzögerungen unter Android 11:
Sortieren Sie die Tabelle Alle Frames nach der Spalte Anwendung in absteigender Reihenfolge, damit die Frames, die am längsten dauern, zuerst angezeigt werden.

Suchen Sie die Frames mit der längsten Laufzeit und wählen Sie die Tabellenzeile aus. Dadurch wird der ausgewählte Frame in der Zeitachsenansicht links vergrößert.

Suchen Sie in den Abschnitten Frame Lifecycle (Frame-Lebenszyklus) und Threads (Threads) nach relevanten Threads.

Verzögerung unter Android 10 und niedriger erkennen
Bei Geräten mit Android 10 (API-Level 29) und niedriger werden relevante Informationen zur Grafikpipeline des Betriebssystems in einem einzelnen Abschnitt im System-Trace des CPU Profiler mit dem Namen Display angezeigt.

- Frames: In diesem Bereich werden die UI-Thread- und
RenderThread-Trace-Ereignisse in Ihrer App angezeigt. Ereignisse, die länger als 16 ms dauern, sind rot gefärbt, um potenzielle Ruckler hervorzuheben, da sie die Frist für das Rendern mit 60 fps überschreiten. - SurfaceFlinger: In diesem Abschnitt wird angezeigt, wann SurfaceFlinger die Frame-Puffer verarbeitet. SurfaceFlinger ist ein Systemprozess, der dafür verantwortlich ist, Puffer an das Display zu senden.
- VSYNC: In diesem Abschnitt wird das VSYNC-Signal angezeigt, mit dem die Display-Pipeline synchronisiert wird. Auf dem Track wird das VSYNC-App-Signal angezeigt, das angibt, wann Ihre App zu spät startet. Das liegt in der Regel daran, dass der UI-Thread ausgelastet ist. Dadurch flackert der Bildschirm während einer Animation sichtbar und es kommt zu einer zusätzlichen Eingabelatenz, bis die Animation oder das Scrollen abgeschlossen ist. Das ist besonders wichtig für Displays mit hoher Aktualisierungsrate, da sie häufiger als 60 Mal pro Sekunde oder mit einer variablen Rate auftreten können.
- BufferQueue: In diesem Abschnitt wird angezeigt, wie viele Frame-Puffer in der Warteschlange stehen und darauf warten, von SurfaceFlinger genutzt zu werden. Bei Apps, die auf Geräten mit Android 9 (API-Level 28) oder höher bereitgestellt werden, wird in diesem Track die Pufferanzahl der BufferQueue der App-Oberfläche (
0,1oder2) angezeigt. Mit BufferQueue können Sie den Status von Bildpuffern nachvollziehen, wenn sie zwischen den Android-Grafikkomponenten verschoben werden. Ein Wert von2bedeutet beispielsweise, dass die App derzeit dreifach gepuffert wird, was zu einer zusätzlichen Eingabelatenz führt.
Der Bereich Display enthält nützliche Signale, um potenzielle Ruckler zu erkennen, z. B. wenn der UI-Thread oder RenderThread länger als 16 ms dauert. Wenn Sie die genauen Details der Ursache des Rucklers untersuchen möchten, können Sie den Bereich Threads untersuchen, in dem die für das UI-Rendering relevanten Threads angezeigt werden.

Im obigen Bild sehen Sie im Bereich Threads den UI-Thread (java.com.google.samples.apps.iosched), RenderThread und den Thread GPU
completion. Dies sind die Threads, die für das Rendern der Benutzeroberfläche relevant sind und zu Verzögerungen beitragen können.
So erkennen Sie Ruckeln unter Android 10 oder niedriger:
Sehen Sie sich den Track Frames unter Display an. Die roten Frames sind Kandidaten für die Untersuchung.

Wenn Sie einen potenziell ruckeligen Frame gefunden haben, zoomen Sie hinein, indem Sie
Wdrücken oder das Mausrad drehen, während Sie Strg (Befehlstaste unter macOS) gedrückt halten. Zoomen Sie weiter heran, bis Sie die Trace-Ereignisse im UI-Thread undRenderThreadsehen.
In der Abbildung oben sehen Sie, wann der UI-Thread
Choreographeraufruft, um Animationen, das Layout von Ansichten, das Zeichnen von Bildern und ähnliche Prozesse zu koordinieren.Choreographer#doFrameDrawFrameszeigt, wannRenderThread-Formulare und ‑Probleme tatsächliche Zeichenbefehle an die GPU senden.Wenn Sie ein besonders langes Trace-Ereignis im Haupt-Thread sehen, zoomen Sie hinein, um zu sehen, welche UI-Komponente oder zusammensetzbare Funktion den Frame verzögert.
Erweiterte Analyse mit Perfetto
Die Android Studio-Aufgabe zum Profiling von System-Traces basiert auf Perfetto. Wenn Sie mit komplexen Rendering-Problemen zu tun haben und benutzerdefinierte SQL-Abfragen oder eine erweiterte Zeitachse benötigen, können Sie die Trace-Analyse außerhalb der IDE durchführen.
Exportieren Sie den System-Trace aus Android Studio, indem Sie im Profiler-Bereich auf das Symbol „Trace exportieren“ klicken. Ziehen Sie die resultierende Datei dann in die webbasierte Perfetto-Benutzeroberfläche. So wird eine dedizierte Umgebung für die Analyse der Leistung auf Systemebene bereitgestellt. Informationen zum Interpretieren der Details der OS-Grafikpipeline, z. B. VSYNC, SurfaceFlinger und die Frame-Zeitachse, finden Sie in der offiziellen Perfetto-Dokumentation.
Weitere Informationen
Weitere Informationen zum Reduzieren von Rucklern finden Sie unter Häufige Ursachen für Ruckler.