Systrace to narzędzie do śledzenia systemowego Androida, które zbiera dane o działaniu jądra Linux, procesora, akceleratora graficznego i wszystkich procesach systemu w krótkim czasie. W przeciwieństwie do Traceview, który koncentruje się na metodach wewnątrz aplikacji, Systrace pokazuje obraz systemowy: obciążenie każdego rdzenia CPU, pracę SurfaceFlinger, wywołania Binder i cykle GC. Według Google, 2024, narzędzie jest niezastąpione do diagnozowania pominiętych klatek, częstego zbierania śmieci i anomalii w wątku UI.
Najważniejsze
Systrace to narzędzie wiersza poleceń z Android SDK, które przechwytuje i łączy dane z wielu źródeł śledzenia jądra (ftrace) i przestrzeni użytkownika (atrace) w jeden raport HTML. Narzędzie pojawiło się w Android 4.1 (Jelly Bean) jako zamiennik starego narzędzia traceview do profilowania systemowego i przez długi czas pozostawało standardowym środkiem diagnostyki wydajności na platformie Android.
Systrace opiera się na ftrace — mechanizmie śledzenia jądra Linux, dostępnym w Android od wersji 4.1. Podczas uruchamiania Systrace aktywuje określone kategorie śladów: sched (planista zadań), freq (częstotliwość CPU), idle (stany bezczynności), workq (kolejki robocze), binder, gfx i inne. Dane są zbierane w pierścieniowym buforze jądra i po zatrzymaniu zrzutu łączone w jeden plik trace.html, który otwiera się w dowolnej przeglądarce.
Od Android Studio 3.1 Systrace jest wbudowany w CPU Profiler. W trybie “Trace System Calls” profiler uruchamia Systrace na podłączonym urządzeniu i wyświetla wyniki bezpośrednio w oknie Android Studio. To eliminuje konieczność pracy z wierszem poleceń w podstawowych przypadkach, ale zachowuje pełną funkcjonalność — wszystkie kategorie śladów, filtrowanie i interaktywną oś czasu. Wydajność urządzenia podczas śledzenia spada nieznacznie, ponieważ ftrace jest zaprojektowany do minimalnego narzutu.
Systrace wykorzystuje dwa mechanizmy zbierania danych: ftrace na poziomie jądra dla zdarzeń systemowych i atrace w przestrzeni użytkownika dla znaczników specyficznych dla Androida. ftrace rejestruje przełączania kontekstu (sched_switch), zmiany częstotliwości CPU (cpu_frequency), przerwania (irq_handler_entry) i inne zdarzenia. atrace dodaje znaczniki z frameworka Androida — początek i koniec renderowania klatki, wywołania SurfaceFlinger i transakcje Binder.
Kluczowa możliwość Systrace — wizualizacja łańcucha renderowania każdej klatki: aplikacja → BufferQueue → SurfaceFlinger → HWC (composer) → Display. Jeśli na którymś etapie wystąpi opóźnienie, Systrace pokazuje dokładną przyczynę: aplikacja nie zdążyła przygotować bufora, SurfaceFlinger czekał na VSync lub HWC nie mógł skomponować warstw. Frame Lifecycle na osi czasu jest kolorowany według statusów: zielony (na czas), żółty (opóźnienie), czerwony (pominięcie). Ta wizualizacja to główne narzędzie do optymalizacji wydajności UI.
Systrace obsługuje ponad 20 kategorii śladów, z których każda zawiera zestaw powiązanych zdarzeń. Ważne kategorie: gfx (renderowanie grafiki), input (obsługa wejścia), view (system View), webview (WebView), power (zużycie energii), hal (abstrakcja sprzętowa). Do profilowania gier przydatna jest kategoria gfx z szczegółowością do poleceń GPU przez AGI (Android GPU Inspector).
Systrace zapewnia unikalny dla Androida zestaw możliwości, które są niedostępne w innych profilerach: systemowa oś czasu, metryki na poziomie jądra i automatyczne wykrywanie problemów.
Raport HTML Systrace zawiera wielopoziomową oś czasu, gdzie każdy tor odpowiada jednemu procesowi lub wątkowi. Można przybliżać i oddalać skalę czasu, klikać na zdarzenia, aby wyświetlić szczegóły (czas trwania, proces inicjujący, dodatkowe argumenty). Kodowanie kolorami pomaga szybko się orientować: zielone bloki — praca procesu, niebieskie — oczekiwanie, pomarańczowe — przerwanie, białe — bezczynność.
Systrace automatycznie analizuje ślad i wyświetla komunikaty Alert z wskazaniem problematycznych miejsc. Na przykład: “Buffer underrun — SurfaceFlinger nie zdążył odebrać bufora przed VSync” lub “Long Binder transaction — 42 ms w wątku Binder_1”. Każdy alert zawiera link do odpowiedniego fragmentu osi czasu i zalecenie naprawy. To oszczędza godziny ręcznej analizy i jest jednym z głównych powodów, aby używać Systrace zamiast ręcznego logowania.
Deweloper może dodawać własne znaczniki do śladu Systrace przez API Trace.beginSection i Trace.endSection. Pozwala to prześledzić wykonanie krytycznych fragmentów kodu bezpośrednio na systemowej osi czasu — na przykład oznaczyć początek i koniec ładowania danych lub obliczania układu. Znaczniki są wyświetlane jako osobne bloki na torze aplikacji i widoczne obok zdarzeń systemowych.
| Kategoria | Dane | Typowe zastosowanie |
|---|---|---|
| sched | Przełączania kontekstu, stany bezczynności | Blokady wątków, contention |
| gfx | VSync, przygotowanie bufora, HWC | Frame drops, jank |
| binder | Transakcje Binder, opóźnienie | Opóźnienia IPC, zdalne wywołania |
| freq | Częstotliwość CPU, scaling governor | Throttling, zużycie energii |
| gfx + AGI | Polecenia GPU, shadery | Wydajność gier |
Uruchomienie Systrace jest możliwe na dwa sposoby: przez Android Studio CPU Profiler (tryb “Trace System Calls”) lub przez wiersz poleceń za pomocą skryptu python systrace.py z folderu platform-tools. Każdy sposób ma swoje scenariusze zastosowania.
Podłącz urządzenie, otwórz Profiler (View → Tool Windows → Profiler), wybierz swój proces, przejdź do zakładki CPU, wybierz tryb “Trace System Calls” i naciśnij Record. Po 5–30 sekundach naciśnij Stop — Android Studio uruchomi Systrace na urządzeniu, poczeka na zakończenie i załaduje wynik. Ograniczenie: nagrywanie jest możliwe tylko gdy Profiler jest otwarty, co jest niewygodne dla długich scenariuszy lub automatyzacji.
Dla bardziej elastycznej kontroli użyj skryptu systrace.py. Określ kategorie śladów, czas trwania i nazwę pliku wyjściowego. Przykład: przechwytywanie danych gfx, input i sched na 10 sekund. Do uruchomienia wymagany jest Python 2.7+ i podłączone urządzenie z debugowaniem USB. Na Android 12+ Systrace został zastąpiony przez Perfetto — polecenie pozostaje takie samo, ale skrypt przekierowuje wywołania do perfetto.
# Podstawowe uruchomienie systrace przez 10 sekund
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Tylko kategoria gfx do analizy UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Aby twój kod pojawił się na osi czasu Systrace, otocz krytyczny fragment w Trace.beginSection / Trace.endSection. Ważne, aby beginSection i endSection były ściśle sparowane — w przeciwnym razie Systrace pokaże nieprawidłową oś czasu. W Kotlin wygodnie jest użyć inline-extension, aby zagwarantować zamknięcie sekcji nawet przy wyjątku.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Użycie w kodzie
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Raport Systrace to samodzielny plik HTML, który można otworzyć w Chrome, Edge lub Firefox. Zawiera interaktywną oś czasu, panel wyboru procesów, listę komunikatów alert i kluczowe metryki (frame rate, CPU usage, binder transactions). Zrozumienie struktury raportu to kluczowa umiejętność dla efektywnego profilowania.
Oś czasu wyświetla czas od lewej do prawej. Każdy proces i wątek — osobny tor. Klawisze W/S przybliżają/oddalają, A/D przesuwają w czasie. Zaznacz obszar myszą, aby powiększyć fragment. Linie VSync pokazują granice klatek (co 16.6 ms przy 60 FPS). Jeśli między dwiema liniami VSync nie mieści się pełny cykl renderowania — klatka została pominięta. Zwracaj uwagę na tor SurfaceFlinger: jeśli jest długo zajęty (pomarańczowy blok), oznacza to, że kompozycja warstw spowalnia ogólne renderowanie.
Panel Alerts w lewej części raportu zawiera automatycznie wykryte problemy. Każdy alert jest klikalny — po kliknięciu oś czasu przesuwa się do problematycznego momentu. Najczęstsze alerty: “Long Sync” (długa synchronizacja wątku), “Scheduling Delay” (opóźnienie planisty), “Buffer Overrun” (przepełnienie bufora SurfaceFlinger). Jeśli alert pokazuje wartość około 100 ms dla Scheduling Delay, to bezpośrednio wskazuje, że wątek UI czekał na CPU z powodu obciążenia w tle — należy przenieść ciężkie obliczenia do Worker Thread.
Do analizy pominiętych klatek włącz tory SurfaceFlinger i app.gfx. Każda klatka jest wyświetlana jako prostokąt: zielony (≤16 ms), żółty (16–32 ms), czerwony (>32 ms). Jeśli widzisz czerwony prostokąt na torze aplikacji, kliknij na niego — Systrace pokaże, która dokładnie metoda (lub wywołanie systemowe) przekroczyła limit. Według Google (Android Performance Patterns, 2023), 70% problemów jank jest spowodowanych przez długi onBindViewHolder lub częste GC.
Perfetto to następca Systrace, przedstawiony przez Google w Android 9 (Pie) jako narzędzie eksperymentalne i stał się głównym od Androida 12. Perfetto używa nowoczesnego formatu protobuf, obsługuje długie sesje (godziny zamiast sekund) i posiada interfejs Web UI do przeglądania śladów. Omówmy kluczowe różnice między dwoma systemami.
| Kryterium | Systrace | Perfetto |
|---|---|---|
| Format | Raport HTML (trace.html) | Protobuf (.trace / .perfetto-trace) |
| Czas trwania | Do 60 sekund | Godziny, gigabajty danych |
| Interfejs | Wbudowany HTML | Web UI (ui.perfetto.dev) |
| Kategorie | Stałe (ftrace + atrace) | Rozszerzalne (zapytania SQL do śladu) |
| Mobilność | Tylko Android | Android, Linux, Chrome, Windows |
Pomimo przejścia na Perfetto, umiejętność pracy z Systrace pozostaje aktualna: na urządzeniach do Androida 11 jest używany domyślnie, a Perfetto zachowuje wsteczną zgodność z kategoriami Systrace. W Android Studio CPU Profiler używa Perfetto dla nowych urządzeń i Systrace dla starych — przezroczysto dla użytkownika. Dla CI/CD zaleca się używanie Perfetto, ponieważ jego format nadaje się do automatycznego przetwarzania przez Python i SQL.
Do praktycznego opanowania Systrace rozważmy dwa scenariusze: znalezienie przyczyny pominiętych klatek podczas przewijania i diagnozowanie częstego GC, który blokuje wątek UI.
Uruchom Systrace z kategorią gfx na 10 sekund, przewiń listę w aplikacji. W raporcie znajdź fragmenty z czerwonymi klatkami. Kliknij na problematyczną klatkę i spójrz na tor app — jeśli tam jest blok “inflateLayout” lub “onBindViewHolder” szerokości >16 ms, problem leży w rozwijaniu układu lub wiązaniu danych. Rozwiązanie: zoptymalizuj układ (zmniejsz głębokość ViewGroup, ViewStub), wyodrębnij ładowanie obrazów do Glide z onAttachedToWindow.
Systrace z kategorią freq i sched pozwala zobaczyć, jak często cykle GC wypierają wątek UI. Znajdź tor aplikacji na osi czasu — jeśli widzisz okresowe bloki o czasie trwania 20–50 ms z nazwą “Concurrent GC”, oznacza to, że garbage collector działa zbyt często. Dodaj kategorię “dalvik” do szczegółowej analizy. Rozwiązanie: konwertuj Bitmap na ByteBuffer, używaj puli obiektów (ObjectPool) do częstych alokacji, zmniejsz fragmentację sterty przez argument ART.
# Uruchomienie z kategoriami do analizy UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Przechwytywanie z długością 30 sekund dla powtarzalnego testu
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Często zadawane pytania
Tak, do uruchomienia Systrace nie są wymagane prawa root. Narzędzie używa atrace, który jest dostępny na każdym urządzeniu z włączonym debugowaniem USB. Niektóre kategorie (power, freq) mogą wymagać podpisu systemu, ale podstawowe (gfx, sched, input) działają na wszystkich urządzeniach.
Ograniczenie do 60 sekund jest związane z pojemnością pierścieniowego bufora ftrace — przy dłuższym nagrywaniu bufor jest nadpisywany. Perfetto usuwa to ograniczenie: można nagrywać godziny i otrzymywać ślady o rozmiarze do kilku gigabajtów z przesyłaniem przez USB lub strumieniowym zapisem na dysk.
Możliwe przyczyny: aplikacja nie została przełączona w tryb debuggable, nie dodano flagi android:debuggable=”true” w manifeście lub używana jest wersja release. Sprawdź także, czy w kategoriach podano --app=com.example.app — w przeciwnym razie Systrace przechwytuje tylko procesy systemowe.
Dla C++ użyj ATRACE_BEGIN i ATRACE_END z biblioteki libcutils. Dołącz plik nagłówkowy i otocz potrzebny fragment. Znacznik pojawi się w Systrace na torze twojego procesu, co jest szczególnie przydatne do analizy silników gier (Unity, Unreal).
Na Android 12 i nowszych używaj Perfetto. Zainstaluj agenta perfetto na urządzeniu przez ADB, uruchom nagrywanie w formacie JSON. Do szybkiego przeglądania używaj Perfetto Web UI (ui.perfetto.dev), a dla CI — eksportu poleceniem z TraceProcessor w Pythonie.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również