Systrace je nástroj pro systémové trasování Androidu, který shromažďuje údaje o činnosti linuxového jádra, procesoru, grafického akcelerátoru a všech systémových procesů v krátkém časovém úseku. Na rozdíl od Traceview, který se zaměřuje na metody uvnitř aplikace, Systrace zobrazuje systémový obraz: zatížení každého jádra CPU, práci SurfaceFlingeru, volání Binder a cykly GC. Podle Google, 2024 je nástroj nepostradatelný pro diagnostiku vynechaných snímků, častého shromažďování odpadu a anomálií ve vlákně UI.
Hlavní body
Systrace je nástroj příkazového řádku ze sady Android SDK, který zachycuje a kombinuje data z několika zdrojů trasování jádra (ftrace) a uživatelského prostoru (atrace) do jediné HTML zprávy. Nástroj se objevil v Android 4.1 (Jelly Bean) jako náhrada starého nástroje traceview pro systémové profilování a po dlouhou dobu zůstal standardním prostředkem diagnostiky výkonu na platformě Android.
Systrace se spoléhá na ftrace — mechanismus trasování linuxového jádra, dostupný v Androidu od verze 4.1. Při spuštění Systrace aktivuje zadané kategorie stop: sched (plánovač úloh), freq (frekvence CPU), idle (stavy nečinnosti), workq (pracovní fronty), binder, gfx a další. Data se shromažďují v kruhovém bufferu jádra a po zastavení se spojí do jednoho souboru trace.html, který se otevře v libovolném prohlížeči.
Od Android Studio 3.1 je Systrace integrován do CPU Profileru. V režimu “Trace System Calls” profiler spustí Systrace na připojeném zařízení a zobrazí výsledky přímo v okně Android Studio. Tím odpadá nutnost práce s příkazovým řádkem pro základní případy, přičemž je zachována plná funkčnost — všechny kategorie stop, filtrování a interaktivní časová osa. Výkon zařízení během trasování mírně klesá, protože ftrace je navržen pro minimální režii.
Systrace používá dva mechanismy sběru dat: ftrace na úrovni jádra pro systémové události a atrace v uživatelském prostoru pro značky specifické pro Android. ftrace registruje přepnutí kontextu (sched_switch), změny frekvence CPU (cpu_frequency), přerušení (irq_handler_entry) a další události. atrace přidává značky z Android frameworku — začátek a konec vykreslování snímku, volání SurfaceFlingeru a transakce Binder.
Klíčová možnost Systrace — vizualizace řetězce vykreslování každého snímku: aplikace → BufferQueue → SurfaceFlinger → HWC (composer) → Display. Pokud v některé fázi dojde ke zpoždění, Systrace ukáže přesnou příčinu: aplikace nestihla připravit buffer, SurfaceFlinger čekal na VSync nebo HWC nedokázal složit vrstvy. Frame Lifecycle na časové ose je barevně odlišen podle stavu: zelená (včas), žlutá (zpoždění), červená (vynechání). Tato vizualizace je hlavním nástrojem pro optimalizaci výkonu UI.
Systrace podporuje více než 20 kategorií stop, z nichž každá obsahuje sadu souvisejících událostí. Důležité kategorie: gfx (vykreslování grafiky), input (zpracování vstupu), view (systém View), webview (WebView), power (spotřeba energie), hal (hardwarová abstrakce). Pro profilování her je užitečná kategorie gfx s detailním rozpisem až na úroveň příkazů GPU přes AGI (Android GPU Inspector).
Systrace poskytuje jedinečnou sadu možností pro Android, které nejsou k dispozici v jiných profilerech: systémová časová osa, metriky na úrovni jádra a automatické odhalování problémů.
HTML zpráva Systrace obsahuje víceúrovňovou časovou osu, kde každá stopa odpovídá jednomu procesu nebo vláknu. Časovou škálu lze přibližovat a oddalovat, na události lze klikat pro zobrazení podrobností (doba trvání, iniciující proces, další argumenty). Barevné kódování pomáhá rychle se orientovat: zelené bloky — práce procesu, modré — čekání, oranžové — přerušení, bílé — nečinnost.
Systrace automaticky analyzuje stopu a zobrazuje Alert zprávy s označením problematických míst. Například: „Buffer underrun — SurfaceFlinger nestihl přijmout buffer před VSync” nebo „Long Binder transaction — 42 ms ve vlákně Binder_1”. Každý alert obsahuje odkaz na odpovídající část časové osy a doporučení k opravě. To šetří hodiny ruční analýzy a je jedním z hlavních důvodů pro použití Systrace místo ručního logování.
Vývojář může přidávat vlastní značky do stopy Systrace pomocí API Trace.beginSection a Trace.endSection. To umožňuje sledovat provádění kritických částí kódu přímo na systémové časové ose — například označit začátek a konec načítání dat nebo výpočtu rozvržení. Značky se zobrazí jako samostatné bloky na stopě aplikace a jsou viditelné vedle systémových událostí.
| Kategorie | Data | Typické použití |
|---|---|---|
| sched | Přepnutí kontextu, stavy nečinnosti | Blokování vláken, contention |
| gfx | VSync, příprava bufferu, HWC | Ztráta snímků, jank |
| binder | Transakce Binder, latence | Zpoždění IPC, vzdálená volání |
| freq | Frekvence CPU, scaling governor | Throttling, spotřeba energie |
| gfx + AGI | Příkazy GPU, shadery | Výkon her |
Spuštění Systrace je možné dvěma způsoby: přes Android Studio CPU Profiler (režim “Trace System Calls”) nebo přes příkazový řádek pomocí python skriptu systrace.py ze složky platform-tools. Každý způsob má své scénáře použití.
Připojte zařízení, otevřete Profiler (View → Tool Windows → Profiler), vyberte svůj proces, přejděte na kartu CPU, vyberte režim “Trace System Calls” a stiskněte Record. Po 5–30 sekundách stiskněte Stop — Android Studio spustí Systrace na zařízení, počká na dokončení a načte výsledek. Omezení: nahrávání je možné pouze při otevřeném Profileru, což je nepraktické pro dlouhé scénáře nebo automatizaci.
Pro flexibilnější ovládání použijte skript systrace.py. Určete kategorie stop, dobu trvání a název výstupního souboru. Příklad: zachycení dat gfx, input a sched po dobu 10 sekund. Ke spuštění je potřeba Python 2.7+ a připojené zařízení s USB laděním. Na Android 12+ byl Systrace nahrazen Perfettem — příkaz zůstává stejný, ale skript přesměrovává volání na perfetto.
# Základní spuštění systrace na 10 sekund
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Pouze kategorie gfx pro analýzu UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Aby se váš kód objevil na časové ose Systrace, obalte kritickou část do Trace.beginSection / Trace.endSection. Je důležité, aby beginSection a endSection byly striktně spárovány — jinak Systrace zobrazí nesprávnou časovou osu. V Kotlinu je vhodné použít inline-extension k zaručení uzavření sekce i při výjimce.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Použití v kódu
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Zpráva Systrace je samostatný HTML soubor, který lze otevřít v Chrome, Edge nebo Firefox. Obsahuje interaktivní časovou osu, panel výběru procesů, seznam alert zpráv a klíčové metriky (snímková frekvence, využití CPU, transakce Binder). Porozumění struktuře zprávy je klíčovou dovedností pro efektivní profilování.
Časová osa zobrazuje čas zleva doprava. Každý proces a vlákno — samostatná stopa. Klávesy W/S přibližují/oddalují, A/D posouvají v čase. Vyberte oblast myší pro zvětšení části. VSync čáry ukazují hranice snímků (každých 16.6 ms při 60 FPS). Pokud se mezi dvě VSync čáry nevejde celý cyklus vykreslování — snímek je vynechán. Věnujte pozornost stopě SurfaceFlinger: pokud je dlouho obsazená (oranžový blok), znamená to, že kompozice vrstev zpomaluje celkové vykreslování.
Panel Alerts v levé části zprávy obsahuje automaticky zjištěné problémy. Každý alert je klikací — při kliknutí se časová osa přesune na problematický okamžik. Nejčastější alerty: „Long Sync” (dlouhá synchronizace vlákna), „Scheduling Delay” (zpoždění plánovače), „Buffer Overrun” (přetečení bufferu SurfaceFlingeru). Pokud alert zobrazuje hodnotu kolem 100 ms pro Scheduling Delay, přímo to ukazuje, že vlákno UI čekalo na CPU kvůli zátěži na pozadí — těžké výpočty je třeba přesunout do Worker Thread.
Pro analýzu vynechaných snímků zapněte stopy SurfaceFlinger a app.gfx. Každý snímek je zobrazen jako obdélník: zelený (≤16 ms), žlutý (16–32 ms), červený (>32 ms). Pokud vidíte červený obdélník na stopě aplikace, klikněte na něj — Systrace ukáže, která metoda (nebo systémové volání) překročila limit. Podle Google (Android Performance Patterns, 2023) je 70% problémů s jank způsobeno dlouhým onBindViewHolder nebo častým GC.
Perfetto je nástupce Systrace, představený Googlem v Android 9 (Pie) jako experimentální nástroj a stal se hlavním od Android 12. Perfetto používá moderní protobuf formát dat, podporuje dlouhé relace (hodiny místo sekund) a má Web UI pro prohlížení stop. Podívejme se na klíčové rozdíly mezi oběma systémy.
| Kritérium | Systrace | Perfetto |
|---|---|---|
| Formát | HTML zpráva (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Doba trvání | Až 60 sekund | Hodiny, gigabajty dat |
| Rozhraní | Vestavěné HTML | Web UI (ui.perfetto.dev) |
| Kategorie | Pevné (ftrace + atrace) | Rozšiřitelné (SQL dotazy na stopu) |
| Mobilita | Pouze Android | Android, Linux, Chrome, Windows |
Navzdory přechodu na Perfetto zůstává dovednost práce se Systrace aktuální: na zařízeních do Android 11 se používá standardně a Perfetto zachovává zpětnou kompatibilitu s kategoriemi Systrace. Android Studio CPU Profiler používá Perfetto pro nová zařízení a Systrace pro stará — transparentně pro uživatele. Pro CI/CD se doporučuje použití Perfetta, protože jeho formát je vhodný pro automatické zpracování přes Python a SQL.
Pro praktické zvládnutí Systrace prozkoumáme dva scénáře: nalezení příčiny vynechaných snímků při posouvání a diagnostika častého GC blokujícího vlákno UI.
Spusťte Systrace s kategorií gfx na 10 sekund, posouvejte seznam v aplikaci. Ve zprávě najděte části s červenými snímky. Klikněte na problematický snímek a podívejte se na stopu aplikace — pokud je tam blok “inflateLayout” nebo “onBindViewHolder” o šířce >16 ms, problém je v rozbalování rozvržení nebo vázání dat. Řešení: optimalizujte rozvržení (snižte hloubku ViewGroup, ViewStub), přesuňte načítání obrázků do Glide s onAttachedToWindow.
Systrace s kategorií freq a sched umožňuje vidět, jak často cykly GC vytlačují vlákno UI. Najděte stopu aplikace na časové ose — pokud vidíte periodické bloky s dobou trvání 20–50 ms s názvem “Concurrent GC”, znamená to, že garbage collector pracuje příliš často. Přidejte kategorii “dalvik” pro podrobnou analýzu. Řešení: převeďte Bitmap na ByteBuffer, používejte fond objektů (ObjectPool) pro časté alokace, snižte fragmentaci haldy přes argument ART.
# Spuštění s kategoriemi pro analýzu UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Zachycení s dobou trvání 30 sekund pro reprodukovatelný test
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Často kladené otázky
Ano, pro spuštění Systrace není vyžadován root přístup. Nástroj používá atrace, který je dostupný na každém zařízení s povoleným USB laděním. Některé kategorie (power, freq) mohou vyžadovat podpis systému, ale základní (gfx, sched, input) fungují na všech zařízeních.
Omezení 60 sekund souvisí s kapacitou kruhového bufferu ftrace — při dlouhém nahrávání se buffer přepisuje. Perfetto toto omezení odstraňuje: lze nahrávat hodiny a získávat stopy o velikosti až několik gigabajtů s přenosem přes USB nebo streamováním na disk.
Možné příčiny: aplikace není převedena do režimu debuggable, není přidán příznak android:debuggable=”true” v manifestu, nebo je použita release verze. Také zkontrolujte, zda je v kategoriích uvedeno --app=com.example.app — jinak Systrace zachycuje pouze systémové procesy.
Pro C++ použijte ATRACE_BEGIN a ATRACE_END z knihovny libcutils. Připojte hlavičkový soubor a obalte požadovanou část. Značka se objeví v Systrace na stopě vašeho procesu, což je užitečné zejména pro analýzu herních enginů (Unity, Unreal).
Na Android 12 a novějších používejte Perfetto. Nainstalujte perfetto agenta na zařízení přes ADB, spusťte nahrávání ve formátu JSON. Pro rychlé prohlížení použijte Perfetto Web UI (ui.perfetto.dev) a pro CI — export příkazem s TraceProcessor v Pythonu.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také