Systrace este un instrument de trasare a sistemului Android care colectează date despre funcționarea nucleului Linux, procesorului, acceleratorului grafic și tuturor proceselor sistemului într-un interval scurt de timp. Spre deosebire de Traceview, care se concentrează pe metodele din interiorul aplicației, Systrace arată imaginea de sistem: încărcarea fiecărui nucleu CPU, activitatea SurfaceFlinger, apelurile Binder și ciclurile GC. Conform Google, 2024, instrumentul este indispensabil pentru diagnosticarea cadrelor pierdute, a colectărilor frecvente de gunoi și a anomalilor din firul UI.
Principalele puncte
Systrace este un instrument de linie de comandă din Android SDK care captează și combină date din mai multe surse de trasare a nucleului (ftrace) și spațiului utilizator (atrace) într-un singur raport HTML. Instrumentul a apărut în Android 4.1 (Jelly Bean) ca înlocuitor al vechiului instrument traceview pentru profilarea sistemului și a rămas mult timp mijlocul standard de diagnosticare a performanței pe platforma Android.
Systrace se bazează pe ftrace — mecanismul de trasare a nucleului Linux, disponibil în Android începând cu versiunea 4.1. La pornire, Systrace activează categorii specifice de trasări: sched (planificatorul de sarcini), freq (frecvența CPU), idle (stări de inactivitate), workq (cozi de lucru), binder, gfx și altele. Datele sunt colectate într-un bufer inelar al nucleului și după oprire sunt combinate într-un singur fișier trace.html, care se deschide în orice browser.
Începând cu Android Studio 3.1, Systrace este încorporat în CPU Profiler. În modul „Trace System Calls”, profilerul rulează Systrace pe dispozitivul conectat și afișează rezultatele direct în fereastra Android Studio. Acest lucru elimină necesitatea de a lucra cu linia de comandă pentru cazurile de bază, păstrând în același timp funcționalitatea completă — toate categoriile de trasări, filtrarea și cronologia interactivă. Performanța dispozitivului în timpul trasării scade ușor, deoarece ftrace este proiectat pentru o suprasarcină minimă.
Systrace utilizează două mecanisme de colectare a datelor: ftrace la nivelul nucleului pentru evenimente de sistem și atrace în spațiul utilizator pentru marcaje specifice Android. ftrace înregistrează comutări de context (sched_switch), modificări ale frecvenței CPU (cpu_frequency), întreruperi (irq_handler_entry) și alte evenimente. atrace adaugă marcaje din framework-ul Android — începutul și sfârșitul redării cadrului, apelurile SurfaceFlinger și tranzacțiile Binder.
Caracteristica cheie a Systrace — vizualizarea lanțului de redare a fiecărui cadru: aplicație → BufferQueue → SurfaceFlinger → HWC (composer) → Display. Dacă la orice etapă apare o întârziere, Systrace arată cauza exactă: aplicația nu a reușit să pregătească bufferul, SurfaceFlinger a așteptat VSync sau HWC nu a putut compune straturile. Ciclul de viață al cadrului pe cronologie este colorat în funcție de statusuri: verde (la timp), galben (întârziere), roșu (pierdere). Această vizualizare este instrumentul principal pentru optimizarea performanței UI.
Systrace suportă peste 20 de categorii de trasări, fiecare incluzând un set de evenimente conexe. Categorii importante: gfx (redare grafică), input (procesare intrare), view (sistemul View), webview (WebView), power (consum energie), hal (abstractizare hardware). Pentru profilarea jocurilor, categoria gfx cu detaliere până la comenzi GPU prin AGI (Android GPU Inspector) este utilă.
Systrace oferă un set unic pentru Android de caracteristici care nu sunt disponibile în alte profilere: cronologie de sistem, metrici la nivel de nucleu și detectare automată a problemelor.
Raportul HTML Systrace conține o cronologie pe mai multe niveluri, unde fiecare pistă corespunde unui proces sau fir de execuție. Se poate mări și micșora scara temporală, se poate face clic pe evenimente pentru a vedea detalii (durată, proces inițiator, argumente suplimentare). Codificarea culorilor ajută la orientarea rapidă: blocuri verzi — activitatea procesului, albastru — așteptare, portocaliu — întrerupere, alb — inactivitate.
Systrace analizează automat trasarea și afișează mesaje Alert cu indicarea locurilor problematice. De exemplu: „Buffer underrun — SurfaceFlinger nu a reușit să primească bufferul înainte de VSync” sau „Long Binder transaction — 42 ms în firul Binder_1”. Fiecare alert conține un link către secțiunea corespunzătoare a cronologiei și o recomandare de remediere. Acest lucru economisește ore de analiză manuală și este unul dintre principalele motive pentru a utiliza Systrace în locul logării manuale.
Dezvoltatorul poate adăuga propriile marcaje în trasarea Systrace prin API-ul Trace.beginSection și Trace.endSection. Acest lucru permite urmărirea execuției secțiunilor critice de cod direct pe cronologia de sistem — de exemplu, marcarea începutului și sfârșitului încărcării datelor sau calculării layout-ului. Marcajele sunt afișate ca blocuri separate pe pista aplicației și sunt vizibile alături de evenimentele de sistem.
| Categorie | Date | Utilizare tipică |
|---|---|---|
| sched | Comutări de context, stări de inactivitate | Blocări de fire, contention |
| gfx | VSync, pregătire buffer, HWC | Cadre pierdute, jank |
| binder | Tranzacții Binder, latență | Întârzieri IPC, apeluri la distanță |
| freq | Frecvența CPU, scaling governor | Throttling, consum energie |
| gfx + AGI | Comenzi GPU, shadere | Performanța jocurilor |
Pornirea Systrace este posibilă în două moduri: prin Android Studio CPU Profiler (modul „Trace System Calls”) sau prin linia de comandă cu ajutorul scriptului python systrace.py din folderul platform-tools. Fiecare mod are propriile scenarii de utilizare.
Conectați dispozitivul, deschideți Profiler (View → Tool Windows → Profiler), selectați procesul dvs., mergeți la fila CPU, selectați modul „Trace System Calls” și apăsați Record. După 5–30 de secunde apăsați Stop — Android Studio va rula Systrace pe dispozitiv, va aștepta finalizarea și va încărca rezultatul. Limitare: înregistrarea este posibilă doar cât timp Profiler este deschis, ceea ce este incomod pentru scenarii lungi sau automatizare.
Pentru un control mai flexibil, utilizați scriptul systrace.py. Specificați categoriile de trasări, durata și numele fișierului de ieșire. Exemplu: capturarea datelor gfx, input și sched timp de 10 secunde. Pentru pornire este necesar Python 2.7+ și un dispozitiv conectat cu debugare USB. Pe Android 12+, Systrace a fost înlocuit cu Perfetto — comanda rămâne aceeași, dar scriptul redirecționează apelurile către perfetto.
# Pornirea de bază a systrace timp de 10 secunde
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Doar categoria gfx pentru analiza UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Pentru ca codul dvs. să apară pe cronologia Systrace, înfășurați secțiunea critică în Trace.beginSection / Trace.endSection. Este important ca beginSection și endSection să fie strict pereche — altfel Systrace va afișa o cronologie incorectă. În Kotlin, este convenabil să folosiți inline-extension pentru a garanta închiderea secțiunii chiar și la excepție.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Utilizare în cod
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Raportul Systrace este un fișier HTML autonom care poate fi deschis în Chrome, Edge sau Firefox. Acesta conține o cronologie interactivă, un panou de selectare a proceselor, o listă de mesaje alert și metrici cheie (rata cadrelor, utilizare CPU, tranzacții Binder). Înțelegerea structurii raportului este o abilitate cheie pentru profilarea eficientă.
Cronologia afișează timpul de la stânga la dreapta. Fiecare proces și fir de execuție — o pistă separată. Tastele W/S măresc/micșorează, A/D deplasează în timp. Selectați o zonă cu mouse-ul pentru a mări o secțiune. Liniile VSync arată limitele cadrelor (la fiecare 16.6 ms la 60 FPS). Dacă între două linii VSync nu încape un ciclu complet de redare — cadrul este pierdut. Acordați atenție pistei SurfaceFlinger: dacă este ocupată mult timp (bloc portocaliu), înseamnă că compunerea straturilor încetinește redarea generală.
Panoul Alerts din partea stângă a raportului conține probleme detectate automat. Fiecare alert este clicabil — la clic, cronologia se deplasează la momentul problemă. Cele mai frecvente alert: „Long Sync” (sincronizare lungă a firului), „Scheduling Delay” (întârziere a planificatorului), „Buffer Overrun” (depășire a bufferului SurfaceFlinger). Dacă alert arată o valoare de aproximativ 100 ms pentru Scheduling Delay, aceasta indică direct că firul UI a așteptat CPU din cauza încărcării de fundal — trebuie mutate calculele grele în Worker Thread.
Pentru analiza cadrelor pierdute, activați pistele SurfaceFlinger și app.gfx. Fiecare cadru este afișat ca un dreptunghi: verde (≤16 ms), galben (16–32 ms), roșu (>32 ms). Dacă vedeți un dreptunghi roșu pe pista aplicației, faceți clic pe el — Systrace va arăta care metodă (sau apel de sistem) a depășit limita. Conform Google (Android Performance Patterns, 2023), 70% dintre problemele jank sunt cauzate de onBindViewHolder lung sau GC frecvent.
Perfetto este succesorul Systrace, prezentat de Google în Android 9 (Pie) ca instrument experimental și devenit principal începând cu Android 12. Perfetto utilizează un format modern de protobuf, suportă sesiuni lungi (ore în loc de secunde) și are o interfață Web UI pentru vizualizarea trasărilor. Să analizăm diferențele cheie dintre cele două sisteme.
| Criteriu | Systrace | Perfetto |
|---|---|---|
| Format | Raport HTML (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Durata | Până la 60 de secunde | Ore, gigaocteți de date |
| Interfață | HTML încorporat | Web UI (ui.perfetto.dev) |
| Categorii | Fixate (ftrace + atrace) | Extensibile (interogări SQL pe trasare) |
| Mobilitate | Doar Android | Android, Linux, Chrome, Windows |
În ciuda tranziției la Perfetto, abilitatea de a lucra cu Systrace rămâne relevantă: pe dispozitivele până la Android 11 este utilizat implicit, iar Perfetto păstrează compatibilitatea inversă cu categoriile Systrace. În Android Studio CPU Profiler, Perfetto este utilizat pentru dispozitive noi, iar Systrace pentru cele vechi — transparent pentru utilizator. Pentru CI/CD, se recomandă utilizarea Perfetto, deoarece formatul său este potrivit pentru procesarea automată prin Python și SQL.
Pentru însușirea practică a Systrace, să analizăm două scenarii: găsirea cauzei cadrelor pierdute la derulare și diagnosticarea GC frecvent care blochează firul UI.
Porniți Systrace cu categoria gfx timp de 10 secunde, derulați lista în aplicație. În raport, găsiți secțiunile cu cadre roșii. Faceți clic pe cadrul problemă și uitați-vă la pista app — dacă acolo există un bloc “inflateLayout” sau “onBindViewHolder” cu lățimea >16 ms, problema este în expandarea layout-ului sau legarea datelor. Soluție: optimizați layout-ul (reduceți adâncimea ViewGroup, ViewStub), mutați încărcarea imaginilor în Glide cu onAttachedToWindow.
Systrace cu categoria freq și sched permite să vedeți cât de des ciclurile GC înlătură firul UI. Găsiți pista aplicației pe cronologie — dacă vedeți blocuri periodice cu durata de 20–50 ms cu numele „Concurrent GC”, înseamnă că garbage collectorul funcționează prea des. Adăugați categoria “dalvik” pentru o analiză detaliată. Soluție: convertiți Bitmap în ByteBuffer, utilizați un pool de obiecte (ObjectPool) pentru alocări frecvente, reduceți fragmentarea heap-ului prin argumentul ART.
# Pornirea cu categorii pentru analiza UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Capturarea cu durata de 30 de secunde pentru test reproductibil
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Întrebări frecvente
Da, pentru rularea Systrace nu este necesar accesul root. Instrumentul utilizează atrace, care este disponibil pe orice dispozitiv cu debugare USB activată. Unele categorii (power, freq) pot necesita semnarea sistemului, dar cele de bază (gfx, sched, input) funcționează pe toate dispozitivele.
Limitarea la 60 de secunde este legată de volumul buferului inelar ftrace — la înregistrarea lungă, buferul este suprascris. Perfetto elimină această limitare: se pot înregistra ore și obține trasări de dimensiune de până la câțiva gigaocteți cu transfer prin USB sau înregistrare în flux pe disc.
Cauze posibile: aplicația nu este trecută în modul debuggable, nu a fost adăugat flagul android:debuggable=”true” în manifest sau se utilizează o compilare release. De asemenea, verificați dacă în categorii este specificat --app=com.example.app — altfel Systrace captează doar procesele de sistem.
Pentru C++, utilizați ATRACE_BEGIN și ATRACE_END din biblioteca libcutils. Includeți fișierul antet și înfășurați secțiunea dorită. Marcajul va apărea în Systrace pe pista procesului dvs., ceea ce este util în special pentru analiza motoarelor de jocuri (Unity, Unreal).
Pe Android 12 și versiuni ulterioare, utilizați Perfetto. Instalați agentul perfetto pe dispozitiv prin ADB, porniți înregistrarea în format JSON. Pentru vizualizare rapidă, utilizați Perfetto Web UI (ui.perfetto.dev), iar pentru CI — exportul prin comandă cu TraceProcessor în Python.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și