Systrace је алат за системско праћење Android-а који прикупља податке о раду Linux кернела, процесора, графичког акцелератора и свих процеса система у кратком временском периоду. За разлику од Traceview-а, који се фокусира на методе унутар апликације, Systrace приказује системску слику: оптерећење сваког CPU језгра, рад SurfaceFlinger-а, Binder позиве и GC циклусе. Према Google-у, 2024, алат је незаменљив за дијагностику пропуштених кадрова, честих сакупљања ђубрета и аномалија у UI нити.
Главно
Systrace је алат командне линије из Android SDK-а који хвата и обједињује податке из више извора праћења кернела (ftrace) и корисничког простора (atrace) у један HTML извештај. Алат се појавио у Android 4.1 (Jelly Bean) као замена за стари алат traceview за системско профилисање и дуго је остао стандардно средство дијагностике перформанси на Android платформи.
Systrace се ослања на ftrace — механизам праћења Linux кернела, доступан у Android-у од верзије 4.1. При покретању, Systrace активира задате категорије трагова: sched (планирач задатака), freq (фреквенција CPU), idle (стања мировања), workq (радни редови), binder, gfx и друге. Подаци се прикупљају у кружни бафер кернела и након заустављања дампа обједињују се у један фајл trace.html, који се отвара у било ком прегледачу.
Од Android Studio 3.1, Systrace је уграђен у CPU Profiler. У режиму “Trace System Calls” профилер покреће Systrace на повезаном уређају и приказује резултате директно у прозору Android Studio. Ово елиминише потребу за радом са командном линијом у основним случајевима, али задржава пуну функционалност — све категорије трагова, филтрирање и интерактивни тајмлајн. Перформансе уређаја током праћења се незнатно смањују, јер је ftrace пројектован за минимално оптерећење.
Systrace користи два механизма прикупљања података: ftrace на нивоу кернела за системске догађаје и atrace у корисничком простору за Android-специфичне ознаке. ftrace региструје пребацивања контекста (sched_switch), промене фреквенције CPU (cpu_frequency), прекиде (irq_handler_entry) и друге догађаје. atrace додаје ознаке из Android фрејмворка — почетак и крај рендеровања кадра, позиве SurfaceFlinger-а и Binder трансакције.
Кључна могућност Systrace-а — визуелизација ланца рендеровања сваког кадра: апликација → BufferQueue → SurfaceFlinger → HWC (composer) → Display. Ако у било којој фази дође до кашњења, Systrace показује тачан узрок: апликација није стигла да припреми бафер, SurfaceFlinger је чекао VSync или HWC није могао да компонује слојеве. Frame Lifecycle на тајмлајну је обојен према статусима: зелено (на време), жуто (кашњење), црвено (пропуштено). Ова визуелизација је главни алат за оптимизацију UI перформанси.
Systrace подржава преко 20 категорија трагова, од којих свака укључује скуп повезаних догађаја. Важне категорије: gfx (рендеровање графике), input (обрада уноса), view (систем View), webview (WebView), power (потрошња енергије), hal (хардверска апстракција). За профилисање игара корисна је категорија gfx са детаљизацијом до GPU команди преко AGI (Android GPU Inspector).
Systrace пружа јединствен скуп могућности за Android које нису доступне у другим профилерима: системски тајмлајн, метрике на нивоу кернела и аутоматско откривање проблема.
HTML извештај Systrace-а садржи вишеслојни тајмлајн, где свака трака одговара једном процесу или нити. Може се приближавати и удаљавати временска скала, кликати на догађаје за приказ детаља (трајање, процес-иницијатор, додатни аргументи). Кодирање бојама помаже у брзом сналажењу: зелени блокови — рад процеса, плави — чекање, наранџасти — прекид, бели — мировање.
Systrace аутоматски анализира траг и приказује Alert поруке са назнаком проблематичних места. На пример: “Buffer underrun — SurfaceFlinger није стигао да прими бафер пре VSync-а” или “Long Binder transaction — 42 ms у нити Binder_1”. Сваки alert садржи линк ка одговарајућем делу тајмлајна и препоруку за исправку. Ово штеди сате ручне анализе и један је од главних разлога да се користи Systrace уместо ручног логовања.
Програмер може додати сопствене ознаке у Systrace траг кроз API Trace.beginSection и Trace.endSection. Ово омогућава праћење извршавања критичних делова кода директно на системском тајмлајну — на пример, означавање почетка и краја учитавања података или израчунавања распореда. Ознаке се приказују као засебни блокови на траци апликације и видљиве су поред системских догађаја.
| Категорија | Подаци | Типична примена |
|---|---|---|
| sched | Пребацивања контекста, стања мировања | Блокирање нити, contention |
| gfx | VSync, припрема бафера, HWC | Пад кадрова, jank |
| binder | Binder трансакције, латенција | IPC кашњења, удаљени позиви |
| freq | Фреквенција CPU, scaling governor | Throttling, потрошња енергије |
| gfx + AGI | GPU команде, шејдери | Перформансе игара |
Покретање Systrace-а је могуће на два начина: преко Android Studio CPU Profiler-а (режим “Trace System Calls”) или преко командне линије помоћу python скрипта systrace.py из фасцикле platform-tools. Сваки начин има своје сценарије примене.
Повежите уређај, отворите Profiler (View → Tool Windows → Profiler), изаберите свој процес, пређите на картицу CPU, изаберите режим “Trace System Calls” и притисните Record. Након 5–30 секунди притисните Stop — Android Studio ће покренути Systrace на уређају, сачекати завршетак и учитати резултат. Ограничење: снимање је могуће само док је Profiler отворен, што је непрактично за дуге сценарије или аутоматизацију.
За флексибилнију контролу користите скрипт systrace.py. Наведите категорије трагова, трајање и име излазног фајла. Пример: хватање података gfx, input и sched у трајању од 10 секунди. За покретање је потребан Python 2.7+ и повезан уређај са USB отклањањем грешака. На Android 12+, Systrace је замењен Perfetto-ом — команда остаје иста, али скрипт преусмерава позиве на perfetto.
# Основно покретање systrace-а у трајању од 10 секунди
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Само gfx категорија за анализу UI-а
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Да би се ваш код појавио на Systrace тајмлајну, обавите критични део у Trace.beginSection / Trace.endSection. Важно је да beginSection и endSection буду строго упарени — иначе ће Systrace приказати нетачан тајмлајн. У Kotlin-у је згодно користити inline-extension како би се гарантовало затварање секције чак и при изузетку.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Коришћење у коду
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Извештај Systrace-а је самосталан HTML фајл који се може отворити у Chrome-у, Edge-у или Firefox-у. Садржи интерактивни тајмлајн, панел за избор процеса, листу alert порука и кључне метрике (брзина кадрова, искоришћеност CPU, Binder трансакције). Разумевање структуре извештаја је кључна вештина за ефикасно профилисање.
Тајмлајн приказује време слева надесно. Сваки процес и нит — посебна трака. Тастери W/S приближавају/удаљавају, A/D померају по времену. Изаберите област мишем за увећавање дела. VSync линије показују границе кадрова (сваких 16.6 ms при 60 FPS). Ако између две VSync линије не стане комплетан циклус рендеровања — кадар је пропуштен. Обратите пажњу на траку SurfaceFlinger: ако је дуго заузета (наранџасти блок), значи да композиција слојева успорава укупно рендеровање.
Панел Alerts у левом делу извештаја садржи аутоматски откривене проблеме. Сваки alert је кликабилан — при клику, тајмлајн се помера ка проблематичном тренутку. Најчешћи alert: “Long Sync” (дуга синхронизација нити), “Scheduling Delay” (кашњење планирача), “Buffer Overrun” (прекорачење бафера SurfaceFlinger-а). Ако alert показује вредност око 100 ms за Scheduling Delay, то директно указује да је UI нит чекала CPU због позадинског оптерећења — потребно је преместити тешка израчунавања у Worker Thread.
За анализу пропуштених кадрова укључите траке SurfaceFlinger и app.gfx. Сваки кадар се приказује као правоугаоник: зелени (≤16 ms), жути (16–32 ms), црвени (>32 ms). Ако видите црвени правоугаоник на траци апликације, кликните на њега — Systrace ће показати који тачно метод (или системски позив) је прекорачио границу. Према Google-у (Android Performance Patterns, 2023), 70% jank проблема је узроковано дугим onBindViewHolder-ом или честим GC.
Perfetto је наследник Systrace-а, представљен од стране Google-а у Android 9 (Pie) као експериментални алат и постао главни од Android 12. Perfetto користи савремени протобуфер формат података, подржава дуге сесије (сати уместо секунди) и има Web UI за преглед трагова. Размотримо кључне разлике два система.
| Критеријум | Systrace | Perfetto |
|---|---|---|
| Формат | HTML извештај (trace.html) | Протобуфер (.trace / .perfetto-trace) |
| Трајање | До 60 секунди | Сати, гигабајти података |
| Интерфејс | Уграђени HTML | Web UI (ui.perfetto.dev) |
| Категорије | Фиксне (ftrace + atrace) | Прошириве (SQL упити на трагу) |
| Мобилност | Само Android | Android, Linux, Chrome, Windows |
Упркос преласку на Perfetto, вештина рада са Systrace-ом остаје актуелна: на уређајима до Android 11 користи се подразумевано, а Perfetto задржава уназад компатибилност са Systrace категоријама. Android Studio CPU Profiler користи Perfetto за нове уређаје и Systrace за старе — транспарентно за корисника. За CI/CD препоручује се коришћење Perfetto-а, јер је његов формат погодан за аутоматску обраду кроз Python и SQL.
За практично савладавање Systrace-а размотримо два сценарија: проналажење узрока пропуштених кадрова при скроловању и дијагностика честог GC-а који блокира UI нит.
Покрените Systrace са категоријом gfx у трајању од 10 секунди, скролујте листу у апликацији. У извештају пронађите делове са црвеним кадровима. Кликните на проблематични кадар и погледајте траку app — ако се тамо налази блок “inflateLayout” или “onBindViewHolder” ширине >16 ms, проблем је у развлачењу распореда или везивању података. Решење: оптимизујте распоред (смањите дубину ViewGroup, ViewStub), преместите учитавање слика у Glide са onAttachedToWindow.
Systrace са категоријом freq и sched омогућава да видите колико често GC циклуси истискују UI нит. Пронађите траку апликације на тајмлајну — ако видите периодичне блокове трајања 20–50 ms са именом “Concurrent GC”, то значи да сакупљач ђубрета ради пречесто. Додајте категорију “dalvik” за детаљну анализу. Решење: конвертујте Bitmap у ByteBuffer, користите пул објеката (ObjectPool) за честе алокације, смањите фрагментацију хипа кроз ART аргумент.
# Покретање са категоријама за анализу UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Хватање у трајању од 30 секунди за поновљиви тест
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Често постављана питања
Да, за покретање Systrace-а није потребан root приступ. Алат користи atrace, који је доступан на сваком уређају са укљученим USB отклањањем грешака. Неке категорије (power, freq) могу захтевати потпис система, али основне (gfx, sched, input) раде на свим уређајима.
Ограничење од 60 секунди повезано је са запремином кружног бафера ftrace-а — при дугом снимању бафер се преписује. Perfetto уклања ово ограничење: могуће је снимати сате и добити трагове величине до неколико гигабајта са преносом преко USB-а или стримовним записом на диск.
Могући узроци: апликација није пребачена у debuggable режим, није додата заставица android:debuggable=”true” у манифесту или се користи релеазна верзија. Такође проверите да ли су у категоријама наведени --app=com.example.app — иначе Systrace хвата само системске процесе.
За C++ користите ATRACE_BEGIN и ATRACE_END из библиотеке libcutils. Укључите заглавни фајл и обавите жељени део. Ознака ће се појавити у Systrace-у на траци вашег процеса, што је посебно корисно за анализу гејминг енџина (Unity, Unreal).
На Android 12 и новијим користите Perfetto. Инсталирајте perfetto агента на уређај преко ADB-а, покрените снимање у JSON формату. За брзи преглед користите Perfetto Web UI (ui.perfetto.dev), а за CI — командин извоз са TraceProcessor-ом у Python-у.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође