Systrace är ett verktyg för systemspårning av Android som samlar in data om Linux-kärnans, processorns, grafikacceleratorns och alla systemprocessers arbete under en kort tidsperiod. Till skillnad från Traceview, som fokuserar på metoder i applikationen, visar Systrace systembilden: belastning på varje CPU-kärna, SurfaceFlingers arbete, Binder-anrop och GC-cykler. Enligt Google, 2024 är verktyget oumbärligt för att diagnostisera hoppade bildrutor, frekvent sophämtning och avvikelser i UI-tråden.
Huvudpunkter
Systrace är ett kommandoradsverktyg från Android SDK som fångar och kombinerar data från flera spårningskällor för kärnan (ftrace) och användarutrymmet (atrace) till en enda HTML-rapport. Verktyget dök upp i Android 4.1 (Jelly Bean) som ersättning för det gamla traceview-verktyget för systemprofilering och förblev under lång tid standardverktyget för prestandadiagnostik på Android-plattformen.
Systrace förlitar sig på ftrace — mekanismen för spårning av Linux-kärnan, tillgänglig i Android från version 4.1. Vid start aktiverar Systrace angivna spårningskategorier: sched (uppgiftsschemaläggare), freq (CPU-frekvens), idle (vilolägen), workq (arbetsköer), binder, gfx och andra. Data samlas i en ringbuffert i kärnan och efter stopp sammanfogas de till en enda trace.html-fil som kan öppnas i valfri webbläsare.
Från och med Android Studio 3.1 är Systrace inbyggt i CPU Profiler. I läget ”Trace System Calls” startar profileraren Systrace på den anslutna enheten och visar resultaten direkt i Android Studio-fönstret. Detta eliminerar behovet av att arbeta med kommandoraden för grundläggande fall, samtidigt som full funktionalitet bibehålls — alla spårningskategorier, filtrering och interaktiv tidslinje. Enhetens prestanda under spårning minskar något eftersom ftrace är utformat för minimal overhead.
Systrace använder två mekanismer för datainsamling: ftrace på kärnnivå för systemhändelser och atrace i användarutrymmet för Android-specifika markeringar. ftrace registrerar kontextbyten (sched_switch), CPU-frekvensändringar (cpu_frequency), avbrott (irq_handler_entry) och andra händelser. atrace lägger till markeringar från Android-ramverket — början och slutet av bildrendering, SurfaceFlinger-anrop och Binder-transaktioner.
Systrace viktigaste funktion — visualisering av renderingskedjan för varje bild: applikation → BufferQueue → SurfaceFlinger → HWC (composer) → Display. Om en försening uppstår i något skede visar Systrace den exakta orsaken: applikationen hann inte förbereda bufferten, SurfaceFlinger väntade på VSync eller HWC kunde inte komponera lagren. Frame Lifecycle på tidslinjen är färgkodad efter status: grön (i tid), gul (försening), röd (hoppad). Denna visualisering är det främsta verktyget för att optimera UI-prestanda.
Systrace stöder över 20 spårningskategorier, som var och en innehåller en uppsättning relaterade händelser. Viktiga kategorier: gfx (grafikrendering), input (inmatningsbearbetning), view (View-system), webview (WebView), power (energiförbrukning), hal (hårdvaruabstraktion). För profilering av spel är kategorin gfx med detaljering ner till GPU-kommandon via AGI (Android GPU Inspector) användbar.
Systrace erbjuder en unik uppsättning funktioner för Android som inte finns i andra profilerare: systemtidslinje, mätvärden på kärnnivå och automatisk problemdetektering.
Systrace HTML-rapport innehåller en flernivå tidslinje, där varje spår motsvarar en process eller tråd. Tidsskalan kan zoomas in och ut, händelser kan klickas för att visa detaljer (varaktighet, initierande process, ytterligare argument). Färgkodning hjälper till med snabb orientering: gröna block — processarbete, blå — väntan, orange — avbrott, vit — inaktivitet.
Systrace analyserar automatiskt spårningen och visar Alert-meddelanden med indikation på problematiska platser. Till exempel: ”Buffer underrun — SurfaceFlinger hann inte ta emot bufferten före VSync” eller ”Long Binder transaction — 42 ms i tråden Binder_1”. Varje alert innehåller en länk till motsvarande del av tidslinjen och en rekommendation för korrigering. Detta sparar timmar av manuell analys och är en av huvudorsakerna att använda Systrace istället för manuell loggning.
Utvecklaren kan lägga till egna markeringar i Systrace-spårningen via API:et Trace.beginSection och Trace.endSection. Detta gör det möjligt att följa exekveringen av kritiska kodavsnitt direkt på systemtidslinjen — till exempel markera början och slutet av datainläsning eller beräkning av layout. Markeringarna visas som separata block på applikationens spår och är synliga bredvid systemhändelser.
| Kategori | Data | Typisk användning |
|---|---|---|
| sched | Kontextbyten, vilolägen | Trådblockering, contention |
| gfx | VSync, buffertberedning, HWC | Bildtappning, jank |
| binder | Binder-transaktioner, latens | IPC-förseningar, fjärranrop |
| freq | CPU-frekvens, scaling governor | Throttling, energiförbrukning |
| gfx + AGI | GPU-kommandon, shaders | Spelprestanda |
Att starta Systrace är möjligt på två sätt: via Android Studio CPU Profiler (läget ”Trace System Calls”) eller via kommandoraden med python-skriptet systrace.py från mappen platform-tools. Varje sätt har sina egna användningsscenarier.
Anslut enheten, öppna Profiler (View → Tool Windows → Profiler), välj din process, gå till fliken CPU, välj läget ”Trace System Calls” och tryck på Record. Efter 5–30 sekunder trycker du på Stop — Android Studio startar Systrace på enheten, väntar på slutförande och laddar resultatet. Begränsning: inspelning är endast möjlig medan Profiler är öppen, vilket är obekvämt för långa scenarier eller automatisering.
För mer flexibel kontroll, använd skriptet systrace.py. Ange spårningskategorier, varaktighet och namn på utdatafilen. Exempel: insamling av gfx-, input- och sched-data under 10 sekunder. För start krävs Python 2.7+ och en ansluten enhet med USB-felsökning. På Android 12+ har Systrace ersatts av Perfetto — kommandot förblir detsamma, men skriptet omdirigerar anrop till perfetto.
# Grundläggande start av systrace under 10 sekunder
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Endast kategorin gfx för UI-analys
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
För att din kod ska visas på Systrace-tidslinjen, omge den kritiska delen med Trace.beginSection / Trace.endSection. Det är viktigt att beginSection och endSection är strikt parade — annars visar Systrace en felaktig tidslinje. I Kotlin är det bekvämt att använda inline-extension för att garantera att sektionen stängs även vid undantag.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Användning i koden
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Systrace-rapporten är en fristående HTML-fil som kan öppnas i Chrome, Edge eller Firefox. Den innehåller en interaktiv tidslinje, en panel för val av processer, en lista med alert-meddelanden och viktiga mätvärden (bildfrekvens, CPU-användning, Binder-transaktioner). Att förstå rapportens struktur är en viktig färdighet för effektiv profilering.
Tidslinjen visar tid från vänster till höger. Varje process och tråd — ett separat spår. Tangenterna W/S zoomar in/ut, A/D flyttar i tiden. Välj ett område med musen för att förstora en sektion. VSync-linjer visar bildgränser (var 16,6 ms vid 60 FPS). Om en fullständig renderingscykel inte får plats mellan två VSync-linjer — bilden har hoppats över. Var uppmärksam på SurfaceFlinger-spåret: om det är upptaget länge (orange block), saktar lagersammansättningen ner den allmänna renderingen.
Panelen Alerts i den vänstra delen av rapporten innehåller automatiskt upptäckta problem. Varje alert är klickbar — vid klick flyttas tidslinjen till problemögonblicket. De vanligaste alert: ”Long Sync” (lång trådsynkronisering), ”Scheduling Delay” (schemats försening), ”Buffer Overrun” (buffertöverskridning i SurfaceFlinger). Om en alert visar ett värde på cirka 100 ms för Scheduling Delay, indikerar detta direkt att UI-tråden väntade på CPU på grund av bakgrundsbelastning — tunga beräkningar måste flyttas till en Worker Thread.
För analys av hoppade bildrutor, aktivera spåren SurfaceFlinger och app.gfx. Varje bild visas som en rektangel: grön (≤16 ms), gul (16–32 ms), röd (>32 ms). Om du ser en röd rektangel på applikationsspåret, klicka på den — Systrace visar vilken metod (eller systemanrop) som överskred gränsen. Enligt Google (Android Performance Patterns, 2023) orsakas 70% av jank-problemen av lång onBindViewHolder eller frekvent GC.
Perfetto är efterföljaren till Systrace, introducerad av Google i Android 9 (Pie) som ett experimentellt verktyg och blev det primära från och med Android 12. Perfetto använder ett modernt protobuf-dataformat, stöder långa sessioner (timmar istället för sekunder) och har ett Web UI för att visa spårningar. Låt oss gå igenom de viktigaste skillnaderna mellan de två systemen.
| Kriterium | Systrace | Perfetto |
|---|---|---|
| Format | HTML-rapport (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Varaktighet | Upp till 60 sekunder | Timmar, gigabyte data |
| Gränssnitt | Inbyggd HTML | Web UI (ui.perfetto.dev) |
| Kategorier | Fasta (ftrace + atrace) | Utökningsbara (SQL-frågor på spårning) |
| Mobilitet | Endast Android | Android, Linux, Chrome, Windows |
Trots övergången till Perfetto förblir färdigheten att arbeta med Systrace relevant: på enheter upp till Android 11 används det som standard, och Perfetto behåller bakåtkompatibilitet med Systrace-kategorier. Android Studio CPU Profiler använder Perfetto för nya enheter och Systrace för gamla — transparent för användaren. För CI/CD rekommenderas Perfetto eftersom dess format är lämpligt för automatisk bearbetning via Python och SQL.
För praktisk inlärning av Systrace, låt oss titta på två scenarier: att hitta orsaken till hoppade bildrutor vid scrollning och diagnostisera frekvent GC som blockerar UI-tråden.
Starta Systrace med kategorin gfx under 10 sekunder, scrolla listan i applikationen. I rapporten, hitta sektioner med röda bildrutor. Klicka på den problematiska bilden och titta på app-spåret — om det finns ett block ”inflateLayout” eller “onBindViewHolder” med bredd >16 ms, ligger problemet i layoututvidgning eller databindning. Lösning: optimera layouten (minska ViewGroup-djup, ViewStub), flytta bildladdning till Glide med onAttachedToWindow.
Systrace med kategorierna freq och sched gör det möjligt att se hur ofta GC-cykler tränger undan UI-tråden. Hitta applikationsspåret på tidslinjen — om du ser periodiska block med varaktighet 20–50 ms med namnet ”Concurrent GC”, betyder det att sopinsamlaren arbetar för ofta. Lägg till kategorin ”dalvik” för detaljerad analys. Lösning: konvertera Bitmap till ByteBuffer, använd en objektpool (ObjectPool) för frekventa allokeringar, minska heap-fragmentering via ART-argumentet.
# Start med kategorier för analys av UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Insamling med varaktighet på 30 sekunder för repeterbart test
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Vanliga frågor
Ja, för att köra Systrace krävs ingen root-åtkomst. Verktyget använder atrace, som är tillgängligt på alla enheter med aktiverad USB-felsökning. Vissa kategorier (power, freq) kan kräva systemsignatur, men de grundläggande (gfx, sched, input) fungerar på alla enheter.
Begränsningen på 60 sekunder är relaterad till volymen på ftrace-ringbufferten — vid lång inspelning skrivs bufferten över. Perfetto tar bort denna begränsning: man kan spela in timmar och få spårningar på upp till flera gigabyte med överföring via USB eller strömmande skrivning till disk.
Möjliga orsaker: applikationen är inte överförd till debuggable-läge, flaggan android:debuggable=”true” har inte lagts till i manifestet, eller en release-build används. Kontrollera också om kategorierna har --app=com.example.app angivet — annars fångar Systrace endast systemprocesser.
För C++, använd ATRACE_BEGIN och ATRACE_END från biblioteket libcutils. Inkludera header-filen och omge önskad del. Markeringen visas i Systrace på spåret för din process, vilket är särskilt användbart för analys av spelmotorer (Unity, Unreal).
På Android 12 och senare, använd Perfetto. Installera perfetto-agenten på enheten via ADB, starta inspelning i JSON-format. För snabb visning, använd Perfetto Web UI (ui.perfetto.dev), och för CI — kommandexport med TraceProcessor i Python.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också