Systrace ist ein Android-System-Tracing-Tool, das Daten über den Linux-Kernel, die CPU, die GPU und alle Systemprozesse in kurzer Zeit sammelt. Im Gegensatz zu Traceview, das sich auf Methoden innerhalb der Anwendung konzentriert, zeigt Systrace das Systembild: Auslastung jedes CPU-Kerns, SurfaceFlinger-Operationen, Binder-Aufrufe und GC-Zyklen. Laut Google, 2024 ist das Tool unverzichtbar für die Diagnose von ausgelassenen Frames, häufigen Garbage Collections und Anomalien im UI-Thread.
Wichtige Erkenntnisse
Systrace ist ein Befehlszeilen-Dienstprogramm aus dem Android SDK, das Daten aus mehreren Kernel-Tracing-Quellen (ftrace) und Benutzerbereichsquellen (atrace) erfasst und in einem einzigen HTML-Bericht zusammenführt. Das Tool erschien in Android 4.1 (Jelly Bean) als Ersatz für das alte traceview-Dienstprogramm zur Systemprofilierung und blieb lange Zeit das Standard-Diagnosetool für die Leistung auf der Android-Plattform.
Systrace stützt sich auf ftrace — einen Linux-Kernel-Tracing-Mechanismus, der seit Android 4.1 verfügbar ist. Beim Start aktiviert Systrace die angegebenen Trace-Kategorien: sched (Aufgabenplaner), freq (CPU-Frequenz), idle (Ruhezustände), workq (Arbeitswarteschlangen), binder, gfx und andere. Die Daten werden im Ringpuffer des Kernels gesammelt und nach dem Stoppen in einer einzigen trace.html-Datei zusammengeführt, die in jedem Browser geöffnet werden kann.
Ab Android Studio 3.1 ist Systrace in den CPU Profiler integriert. Im Modus „Trace System Calls“ startet der Profiler Systrace auf dem verbundenen Gerät und zeigt die Ergebnisse direkt im Android Studio-Fenster an. Dadurch entfällt die Notwendigkeit, für grundlegende Fälle mit der Befehlszeile zu arbeiten, während die volle Funktionalität — alle Trace-Kategorien, Filterung und interaktive Zeitachse — erhalten bleibt. Die Geräteleistung während des Tracings nimmt nur unwesentlich ab, da ftrace für minimale Überlastung ausgelegt ist.
Systrace verwendet zwei Datenerfassungsmechanismen: ftrace auf Kernel-Ebene für Systemereignisse und atrace im Benutzerbereich für Android-spezifische Markierungen. ftrace zeichnet Kontextwechsel (sched_switch), CPU-Frequenzänderungen (cpu_frequency), Interrupts (irq_handler_entry) und andere Ereignisse auf. atrace fügt Markierungen aus dem Android-Framework hinzu — Beginn und Ende der Frame-Rendering, SurfaceFlinger-Aufrufe und Binder-Transaktionen.
Die Hauptfunktion von Systrace ist die Visualisierung der Rendering-Pipeline jedes Frames: Anwendung → BufferQueue → SurfaceFlinger → HWC (Composer) → Display. Wenn in einer Phase eine Verzögerung auftritt, zeigt Systrace die genaue Ursache: Die Anwendung hat den Puffer nicht rechtzeitig vorbereitet, SurfaceFlinger wartete auf VSync oder HWC konnte die Ebenen nicht zusammensetzen. Der Frame-Lebenszyklus auf der Zeitachse ist je nach Status farbcodiert: grün (rechtzeitig), gelb (verzögert), rot (ausgelassen). Diese Visualisierung ist das wichtigste Werkzeug zur Optimierung der UI-Leistung.
Systrace unterstützt über 20 Trace-Kategorien, die jeweils eine Reihe zusammenhängender Ereignisse enthalten. Wichtige Kategorien sind: gfx (Grafik-Rendering), input (Eingabeverarbeitung), view (View-System), webview (WebView), power (Stromverbrauch), hal (Hardware-Abstraktionsschicht). Für die Spielprofilierung ist die Kategorie gfx mit GPU-Befehlsdetails über AGI (Android GPU Inspector) nützlich.
Systrace bietet eine einzigartige Reihe von Fähigkeiten für Android, die in anderen Profilern nicht verfügbar sind: System-Zeitachse, Metriken auf Kernel-Ebene und automatische Erkennung von Problemen.
Der Systrace-HTML-Bericht enthält eine mehrstufige Zeitachse, bei der jede Spur einem Prozess oder Thread entspricht. Sie können die Zeitskala vergrößern und verkleinern, auf Ereignisse klicken, um Details anzuzeigen (Dauer, auslösender Prozess, zusätzliche Argumente). Die Farbcodierung hilft bei der schnellen Navigation: grüne Blöcke — Prozess läuft, blaue — wartet, orange — Unterbrechung, weiße — Leerlauf.
Systrace analysiert den Trace automatisch und zeigt Alert-Meldungen an, die Problembereiche angeben. Zum Beispiel: „Buffer underrun — SurfaceFlinger hat den Puffer nicht vor VSync erhalten“ oder „Long Binder transaction — 42 ms im Thread Binder_1“. Jeder Alert enthält einen Link zum entsprechenden Abschnitt der Zeitachse und eine Empfehlung zur Behebung. Dies spart Stunden manueller Analyse und ist einer der Hauptgründe, Systrace anstelle der manuellen Protokollierung zu verwenden.
Entwickler könmen über die Trace.beginSection- und Trace.endSection-API benutzerdefinierte Markierungen zum Systrace-Trace hinzufügen. Dies ermöglicht es, die Ausführung kritischer Codeabschnitte direkt auf der System-Zeitachse zu verfolgen — zum Beispiel den Beginn und das Ende des Ladens von Daten oder der Berechnung von Layouts zu markieren. Die Markierungen erscheinen als separate Blöcke auf der Anwendungsspur und sind neben Systemereignissen sichtbar.
| Kategorie | Daten | Typische Verwendung |
|---|---|---|
| sched | Kontextwechsel, Leerlaufzustände | Thread-Blockaden, Konflikte |
| gfx | VSync, Puffervorbereitung, HWC | Frame-Ausfälle, Ruckeln |
| binder | Binder-Transaktionen, Latenz | IPC-Verzögerungen, entfernte Aufrufe |
| freq | CPU-Frequenz, Scaling-Governor | Throttling, Stromverbrauch |
| gfx + AGI | GPU-Befehle, Shader | Spieleleistung |
Das Ausführen von Systrace ist auf zwei Arten möglich: über den Android Studio CPU Profiler (Modus „Trace System Calls“) oder über die Befehlszeile mit dem Python-Skript systrace.py aus dem Ordner platform-tools. Jede Methode hat ihre eigenen Anwendungsszenarien.
Verbinden Sie das Gerät, öffnen Sie den Profiler (View → Tool Windows → Profiler), wählen Sie Ihren Prozess aus, gehen Sie zur Registerkarte CPU, wählen Sie den Modus „Trace System Calls“ und klicken Sie auf Record. Nach 5–30 Sekunden klicken Sie auf Stop — Android Studio startet Systrace auf dem Gerät, wartet auf den Abschluss und lädt das Ergebnis. Einschränkung: Die Aufnahme ist nur möglich, während der Profiler geöffnet ist, was für lange Szenarien oder Automatisierung unpraktisch ist.
Für eine flexiblere Steuerung verwenden Sie das Skript systrace.py. Geben Sie die Trace-Kategorien, die Dauer und den Namen der Ausgabedatei an. Beispiel: Erfassung von gfx-, input- und sched-Daten für 10 Sekunden. Die Ausführung erfordert Python 2.7+ und ein verbundenes Gerät mit aktiviertem USB-Debugging. Auf Android 12+ wird Systrace durch Perfetto ersetzt — der Befehl bleibt derselbe, aber das Skript leitet Aufrufe an perfetto weiter.
# Grundlegender systrace-Lauf für 10 Sekunden
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Nur gfx-Kategorie für UI-Analyse
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Um Ihren Code auf der Systrace-Zeitachse erscheinen zu lassen, umschließen Sie den kritischen Abschnitt mit Trace.beginSection / Trace.endSection. Es ist wichtig, dass beginSection und endSection streng paarweise auftreten — andernfalls zeigt Systrace eine falsche Zeitachse an. In Kotlin ist es praktisch, eine Inline-Erweiterung zu verwenden, um das Schließen des Abschnitts auch bei einer Ausnahme zu gewährleisten.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Verwendung im Code
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Der Systrace-Bericht ist eine eigenständige HTML-Datei, die in Chrome, Edge oder Firefox geöffnet werden kann. Er enthält eine interaktive Zeitachse, ein Prozessauswahlfeld, eine Liste von Alert-Meldungen und wichtige Metriken (Bildrate, CPU-Auslastung, Binder-Transaktionen). Das Verständnis der Berichtsstruktur ist eine Schlüsselfähigkeit für effektives Profiling.
Die Zeitachse zeigt die Zeit von links nach rechts an. Jeder Prozess und Thread ist eine separate Spur. Die Tasten W/S vergrößern/verkleinern, A/D bewegen sich durch die Zeit. Wählen Sie einen Bereich mit der Maus aus, um einen Abschnitt zu vergrößern. VSync-Linien zeigen Framegrenzen an (alle 16,6 ms bei 60 FPS). Wenn ein vollständiger Rendering-Zyklus nicht zwischen zwei VSync-Linien passt — wird der Frame ausgelassen. Achten Sie auf die SurfaceFlinger-Spur: Wenn sie lange beschäftigt ist (oranger Block), verlangsamt die Ebenenkomposition das gesamte Rendering.
Das Alert-Panel auf der linken Seite des Berichts enthält automatisch erkannte Probleme. Jeder Alert ist anklickbar — beim Klicken bewegt sich die Zeitachse zum problematischen Moment. Die häufigsten Alerts: „Long Sync“ (lange Thread-Synchronisation), „Scheduling Delay“ (Planungsverzögerung), „Buffer Overrun“ (Pufferüberlauf von SurfaceFlinger). Wenn ein Alert einen Wert von ~100 ms für Scheduling Delay anzeigt, deutet dies direkt darauf hin, dass der UI-Thread aufgrund von Hintergrundlast auf die CPU gewartet hat — schwere Berechnungen sollten in einen Worker-Thread verschoben werden.
Um ausgelassene Frames zu analysieren, aktivieren Sie die Spuren SurfaceFlinger und app.gfx. Jeder Frame wird als Rechteck angezeigt: grün (≤16 ms), gelb (16–32 ms), rot (>32 ms). Wenn Sie ein rotes Rechteck auf der App-Spur sehen, klicken Sie darauf — Systrace zeigt, welche spezifische Methode (oder Systemaufruf) das Limit überschritten hat. Laut Google (Android Performance Patterns, 2023) werden 70 % der Ruckelprobleme durch langsames onBindViewHolder oder häufiges GC verursacht.
Perfetto ist der Nachfolger von Systrace, der von Google in Android 9 (Pie) als experimentelles Tool eingeführt wurde und ab Android 12 zur primären Lösung wurde. Perfetto verwendet ein modernes Protobuf-Datenformat, unterstützt lange Sitzungen (Stunden statt Sekunden) und verfügt über eine Web-UI zur Anzeige von Traces. Lassen Sie uns die wichtigsten Unterschiede zwischen den beiden Systemen untersuchen.
| Kriterium | Systrace | Perfetto |
|---|---|---|
| Format | HTML-Bericht (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Dauer | Bis zu 60 Sekunden | Stunden, Gigabyte an Daten |
| Oberfläche | Integriertes HTML | Web-UI (ui.perfetto.dev) |
| Kategorien | Fest (ftrace + atrace) | Erweiterbar (SQL-Abfragen an Trace) |
| Mobilität | Nur Android | Android, Linux, Chrome, Windows |
Trotz des Übergangs zu Perfetto bleiben Systrace-Kenntnisse relevant: Auf Geräten mit Android 11 und niedriger wird es standardmäßig verwendet, und Perfetto behält die Abwärtskompatibilität mit Systrace-Kategorien bei. Im Android Studio CPU Profiler wird Perfetto für neue Geräte und Systrace für ältere verwendet — für den Benutzer transparent. Für CI/CD wird Perfetto empfohlen, da sein Format automatisch über Python und SQL verarbeitet werden kann.
Um Systrace praktisch zu beherrschen, betrachten wir zwei Szenarien: Die Ursache für ausgelassene Frames beim Scrollen zu finden und häufige GC zu diagnostizieren, die den UI-Thread blockieren.
Führen Sie Systrace mit der Kategorie gfx für 10 Sekunden aus und scrollen Sie durch die Liste in der App. Suchen Sie im Bericht nach Abschnitten mit roten Frames. Klicken Sie auf den problematischen Frame und sehen Sie sich die App-Spur an — wenn dort ein Block „inflateLayout“ oder „onBindViewHolder“ breiter als 16 ms ist, liegt das Problem im Layout-Inflation oder Daten-Binding. Lösung: Optimieren Sie das Layout (tiefe ViewGroup reduzieren, ViewStub), lagern Sie das Laden von Bildern an Glide mit onAttachedToWindow aus.
Systrace mit den Kategorien freq und sched ermöglicht es zu sehen, wie oft GC-Zyklen den UI-Thread verdrängen. Suchen Sie die Anwendungsspur auf der Zeitachse — wenn Sie periodische Blöcke mit einer Dauer von 20–50 ms mit dem Namen „Concurrent GC“ sehen, läuft der Garbage Collector zu häufig. Fügen Sie die Kategorie „dalvik“ für eine detaillierte Analyse hinzu. Lösung: Konvertieren Sie Bitmap in ByteBuffer, verwenden Sie einen Objektpool (ObjectPool) für häufige Allokationen, reduzieren Sie die Heap-Fragmentierung durch ART-Argumente.
# Ausführung mit Kategorien für UI- + GC-Analyse
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Aufnahme mit 30 Sekunden Dauer für reproduzierbaren Test
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Häufig gestellte Fragen
Ja, zum Ausführen von Systrace ist kein Root-Zugriff erforderlich. Das Tool verwendet atrace, das auf jedem Gerät mit aktiviertem USB-Debugging verfügbar ist. Einige Kategorien (power, freq) erfordern möglicherweise eine Systemsignatur, aber die wichtigsten (gfx, sched, input) funktionieren auf allen Geräten.
Die 60-Sekunden-Grenze hängt mit der Kapazität des ftrace-Ringpuffers zusammen — bei langer Aufnahme wird der Puffer überschrieben. Perfetto hebt diese Einschränkung auf: Sie können stundenlang aufnehmen und Traces mit einer Größe von bis zu mehreren Gigabyte per USB-Übertragung oder Streaming auf die Festplatte erhalten.
Mögliche Ursachen: Die App befindet sich nicht im Debug-Modus, das Flag android:debuggable=„true“ ist nicht im Manifest gesetzt, oder es wird ein Release-Build verwendet. Überprüfen Sie auch, ob Sie --app=com.example.app in den Kategorien angegeben haben — andernfalls erfasst Systrace nur Systemprozesse.
Für C++ verwenden Sie ATRACE_BEGIN und ATRACE_END aus der libcutils-Bibliothek. Binden Sie die Header-Datei ein und umschließen Sie den gewünschten Abschnitt. Die Markierung erscheint in Systrace auf der Spur Ihres Prozesses, was besonders für die Analyse von Spiel-Engines (Unity, Unreal) nützlich ist.
Verwenden Sie auf Android 12 und höher Perfetto. Installieren Sie den Perfetto-Agenten auf dem Gerät über ADB, starten Sie die Aufnahme im JSON-Format. Verwenden Sie für die schnelle Ansicht die Perfetto-Web-UI (ui.perfetto.dev) und für CI den Befehlszeilenexport mit TraceProcessor in Python.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch