Systrace is een hulpmiddel voor systeemtracering van Android dat gegevens verzamelt over de werking van de Linux-kernel, processor, grafische versneller en alle systeemprocessen in een korte periode. In tegenstelling tot Traceview, dat zich richt op methoden binnen de app, toont Systrace het systeembeeld: belasting van elke CPU-kern, werk van SurfaceFlinger, Binder-aanroepen en GC-cycli. Volgens Google, 2024 is het hulpmiddel onmisbaar voor het diagnosticeren van overgeslagen frames, frequente garbagecollection en afwijkingen in de UI-thread.
Belangrijkste punten
Systrace is een opdrachtregelprogramma uit de Android SDK dat gegevens uit meerdere traceringbronnen van de kernel (ftrace) en gebruikersruimte (atrace) vastlegt en combineert in één HTML-rapport. Het hulpmiddel verscheen in Android 4.1 (Jelly Bean) als vervanging van het oude traceview-hulpmiddel voor systeemprofilering en bleef lange tijd het standaardmiddel voor prestatiediagnose op het Android-platform.
Systrace vertrouwt op ftrace — het traceringmechanisme van de Linux-kernel, beschikbaar in Android vanaf versie 4.1. Bij het starten activeert Systrace opgegeven trace-categorieën: sched (taakplanner), freq (CPU-frequentie), idle (inactieve toestanden), workq (werkrijen), binder, gfx en andere. Gegevens worden verzameld in een ringbuffer van de kernel en na het stoppen samengevoegd tot één trace.html-bestand dat in elke browser kan worden geopend.
Vanaf Android Studio 3.1 is Systrace ingebouwd in de CPU Profiler. In de modus “Trace System Calls” start de profiler Systrace op het aangesloten apparaat en toont de resultaten direct in het Android Studio-venster. Dit elimineert de noodzaak om met de opdrachtregel te werken voor basale gevallen, terwijl de volledige functionaliteit behouden blijft — alle trace-categorieën, filtering en interactieve tijdlijn. De prestaties van het apparaat tijdens tracering nemen licht af, omdat ftrace is ontworpen voor minimale overhead.
Systrace gebruikt twee mechanismen voor gegevensverzameling: ftrace op kernel-niveau voor systeemgebeurtenissen en atrace in de gebruikersruimte voor Android-specifieke markeringen. ftrace registreert contextwisselingen (sched_switch), CPU-frequentiewijzigingen (cpu_frequency), onderbrekingen (irq_handler_entry) en andere gebeurtenissen. atrace voegt markeringen uit het Android-framework toe — begin en einde van frameweergave, SurfaceFlinger-aanroepen en Binder-transacties.
Belangrijkste functie van Systrace — visualisatie van de weergaveketen van elk frame: app → BufferQueue → SurfaceFlinger → HWC (composer) → Display. Als er in een fase vertraging optreedt, toont Systrace de exacte oorzaak: de app kon de buffer niet voorbereiden, SurfaceFlinger wachtte op VSync of HWC kon de lagen niet samenstellen. Frame Lifecycle op de tijdlijn is gekleurd op status: groen (op tijd), geel (vertraging), rood (overgeslagen). Deze visualisatie is het belangrijkste hulpmiddel voor het optimaliseren van UI-prestaties.
Systrace ondersteunt meer dan 20 trace-categorieën, die elk een set gerelateerde gebeurtenissen bevatten. Belangrijke categorieën: gfx (grafische weergave), input (invoerverwerking), view (View-systeem), webview (WebView), power (energieverbruik), hal (hardwareabstractie). Voor het profileren van games is de categorie gfx met detaillering tot GPU-commando's via AGI (Android GPU Inspector) nuttig.
Systrace biedt een unieke set functies voor Android die niet beschikbaar zijn in andere profilers: systeemtijdlijn, metrieken op kernel-niveau en automatische probleemdetectie.
Het HTML-rapport van Systrace bevat een gelaagde tijdlijn, waarbij elk spoor overeenkomt met één proces of thread. De tijdschaal kan worden in- en uitgezoomd, er kan op gebeurtenissen worden geklikt voor details (duur, initiërend proces, extra argumenten). Kleurocodering helpt bij snelle oriëntatie: groene blokken — proceswerk, blauw — wachten, oranje — onderbreking, wit — inactiviteit.
Systrace analyseert automatisch de trace en toont Alert-berichten met aanduiding van probleemlocaties. Bijvoorbeeld: “Buffer underrun — SurfaceFlinger kon de buffer niet ontvangen vóór VSync” of “Long Binder transaction — 42 ms in thread Binder_1”. Elke alert bevat een link naar het corresponderende deel van de tijdlijn en een aanbeveling voor correctie. Dit bespaart uren handmatige analyse en is een van de belangrijkste redenen om Systrace te gebruiken in plaats van handmatig loggen.
De ontwikkelaar kan eigen markeringen aan de Systrace-trace toevoegen via de API Trace.beginSection en Trace.endSection. Dit maakt het mogelijk de uitvoering van kritieke codegedeelten direct op de systeemtijdlijn te volgen — bijvoorbeeld het begin en einde van het laden van gegevens of het berekenen van de lay-out markeren. Markeringen worden weergegeven als aparte blokken op het spoor van de app en zijn zichtbaar naast systeemgebeurtenissen.
| Categorie | Gegevens | Typisch gebruik |
|---|---|---|
| sched | Contextwisselingen, inactieve toestanden | Threadblokkades, contention |
| gfx | VSync, buffervoorbereiding, HWC | Frame drops, jank |
| binder | Binder-transacties, latentie | IPC-vertragingen, externe aanroepen |
| freq | CPU-frequentie, scaling governor | Throttling, energieverbruik |
| gfx + AGI | GPU-commando's, shaders | Gameprestaties |
Het starten van Systrace is op twee manieren mogelijk: via Android Studio CPU Profiler (modus “Trace System Calls”) of via de opdrachtregel met het python-script systrace.py uit de map platform-tools. Elke manier heeft zijn eigen toepassingsscenario's.
Sluit het apparaat aan, open Profiler (View → Tool Windows → Profiler), selecteer uw proces, ga naar het tabblad CPU, selecteer de modus “Trace System Calls” en druk op Record. Druk na 5–30 seconden op Stop — Android Studio start Systrace op het apparaat, wacht op voltooiing en laadt het resultaat. Beperking: opnemen is alleen mogelijk terwijl Profiler geopend is, wat onhandig is voor lange scenario's of automatisering.
Voor meer flexibele controle gebruikt u het script systrace.py. Specificeer de trace-categorieën, duur en naam van het uitvoerbestand. Voorbeeld: vastleggen van gfx-, input- en sched-gegevens gedurende 10 seconden. Voor het starten is Python 2.7+ en een aangesloten apparaat met USB-foutopsporing vereist. Op Android 12+ is Systrace vervangen door Perfetto — de opdracht blijft hetzelfde, maar het script stuurt aanroepen door naar perfetto.
# Basisstart van systrace gedurende 10 seconden
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Alleen categorie gfx voor UI-analyse
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Om uw code op de Systrace-tijdlijn te laten verschijnen, omhult u het kritieke gedeelte met Trace.beginSection / Trace.endSection. Het is belangrijk dat beginSection en endSection strikt gepaard zijn — anders toont Systrace een onjuiste tijdlijn. In Kotlin is het handig om inline-extension te gebruiken om het sluiten van de sectie te garanderen, zelfs bij een uitzondering.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Gebruik in code
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Het Systrace-rapport is een zelfstandig HTML-bestand dat kan worden geopend in Chrome, Edge of Firefox. Het bevat een interactieve tijdlijn, een paneel voor processelectie, een lijst met alert-berichten en belangrijke metrieken (framesnelheid, CPU-gebruik, Binder-transacties). Het begrijpen van de rapportstructuur is een belangrijke vaardigheid voor effectief profileren.
De tijdlijn toont tijd van links naar rechts. Elk proces en thread — een apart spoor. Toetsen W/S zoomen in/uit, A/D verplaatsen in de tijd. Selecteer een gebied met de muis om een sectie te vergroten. VSync-lijnen tonen framegrenzen (elke 16,6 ms bij 60 FPS). Als er tussen twee VSync-lijnen geen volledige weergavecyclus past — is het frame overgeslagen. Let op het SurfaceFlinger-spoor: als het lang bezet is (oranje blok), vertraagt laagcompositie de algemene weergave.
Het paneel Alerts aan de linkerkant van het rapport bevat automatisch gedetecteerde problemen. Elke alert is aanklikbaar — bij klikken verplaatst de tijdlijn zich naar het probleemmoment. De meest voorkomende alerts: “Long Sync” (lange threadsynchronisatie), “Scheduling Delay” (planningsvertraging), “Buffer Overrun” (bufferoverloop SurfaceFlinger). Als een alert een waarde van ongeveer 100 ms toont voor Scheduling Delay, wijst dit er direct op dat de UI-thread op CPU wachtte vanwege achtergrondbelasting — zware berekeningen moeten naar een Worker Thread worden verplaatst.
Schakel voor analyse van overgeslagen frames de sporen SurfaceFlinger en app.gfx in. Elk frame wordt weergegeven als een rechthoek: groen (≤16 ms), geel (16–32 ms), rood (>32 ms). Als u een rode rechthoek op het app-spoor ziet, klik er dan op — Systrace toont welke methode (of systeemaanroep) de limiet heeft overschreden. Volgens Google (Android Performance Patterns, 2023) wordt 70% van de jank-problemen veroorzaakt door lange onBindViewHolder of frequente GC.
Perfetto is de opvolger van Systrace, door Google geïntroduceerd in Android 9 (Pie) als experimenteel hulpmiddel en primair geworden vanaf Android 12. Perfetto gebruikt een modern protobuf-gegevensformaat, ondersteunt lange sessies (uren in plaats van seconden) en heeft een Web UI voor het bekijken van traces. Laten we de belangrijkste verschillen tussen de twee systemen bekijken.
| Criterium | Systrace | Perfetto |
|---|---|---|
| Formaat | HTML-rapport (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Duur | Tot 60 seconden | Uren, gigabytes aan gegevens |
| Interface | Ingebouwd HTML | Web UI (ui.perfetto.dev) |
| Categorieën | Vast (ftrace + atrace) | Uitbreidbaar (SQL-query's op trace) |
| Mobiliteit | Alleen Android | Android, Linux, Chrome, Windows |
Ondanks de overgang naar Perfetto blijft de vaardigheid om met Systrace te werken relevant: op apparaten tot Android 11 wordt het standaard gebruikt en Perfetto behoudt achterwaartse compatibiliteit met Systrace-categorieën. Android Studio CPU Profiler gebruikt Perfetto voor nieuwe apparaten en Systrace voor oude — transparant voor de gebruiker. Voor CI/CD wordt Perfetto aanbevolen, omdat het formaat geschikt is voor automatische verwerking via Python en SQL.
Voor het praktisch onder de knie krijgen van Systrace bekijken we twee scenario's: het vinden van de oorzaak van overgeslagen frames tijdens scrollen en het diagnosticeren van frequente GC die de UI-thread blokkeert.
Start Systrace met de categorie gfx gedurende 10 seconden, scroll door de lijst in de app. Zoek in het rapport secties met rode frames. Klik op het problematische frame en kijk naar het app-spoor — als er een blok “inflateLayout” of “onBindViewHolder” met breedte >16 ms is, ligt het probleem bij het uitvouwen van de lay-out of het binden van gegevens. Oplossing: optimaliseer de lay-out (vermindere ViewGroup-diepte, ViewStub), verplaats het laden van afbeeldingen naar Glide met onAttachedToWindow.
Systrace met de categorieën freq en sched laat zien hoe vaak GC-cycli de UI-thread verdringen. Zoek het app-spoor op de tijdlijn — als u periodieke blokken met een duur van 20–50 ms met de naam “Concurrent GC” ziet, werkt de garbagecollector te vaak. Voeg de categorie “dalvik” toe voor gedetailleerde analyse. Oplossing: converteer Bitmap naar ByteBuffer, gebruik een objectenpool (ObjectPool) voor frequente toewijzingen, verminder heapfragmentatie via het ART-argument.
# Starten met categorieën voor UI + GC-analyse
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Vastleggen met een duur van 30 seconden voor reproduceerbare test
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Veelgestelde vragen
Ja, voor het uitvoeren van Systrace is geen root-toegang vereist. Het hulpmiddel gebruikt atrace, dat beschikbaar is op elk apparaat met ingeschakelde USB-foutopsporing. Sommige categorieën (power, freq) kunnen een systeemhandtekening vereisen, maar de basiscategorieën (gfx, sched, input) werken op alle apparaten.
De beperking van 60 seconden houdt verband met de capaciteit van de ftrace-ringbuffer — bij lange opname wordt de buffer overschreven. Perfetto heft deze beperking op: u kunt uren opnemen en traces krijgen met een grootte tot enkele gigabytes met overdracht via USB of streaming naar schijf.
Mogelijke oorzaken: de app is niet in debuggable-modus gezet, de vlag android:debuggable=”true” is niet toegevoegd in het manifest, of er wordt een release-build gebruikt. Controleer ook of in de categorieën --app=com.example.app is opgegeven — anders legt Systrace alleen systeemprocessen vast.
Gebruik voor C++ ATRACE_BEGIN en ATRACE_END uit de bibliotheek libcutils. Voeg het header-bestand toe en omhul het gewenste gedeelte. De markering verschijnt in Systrace op het spoor van uw proces, wat vooral nuttig is voor analyse van game-engines (Unity, Unreal).
Gebruik op Android 12 en hoger Perfetto. Installeer de perfetto-agent op het apparaat via ADB, start opname in JSON-formaat. Gebruik voor snelle weergave Perfetto Web UI (ui.perfetto.dev) en voor CI — opdrachtexport met TraceProcessor in Python.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook