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 (композитор) → Дисплей. Якщо на якомусь етапі виникає затримка, 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 мс у потоці Binder_1». Кожен alert містить посилання на відповідну ділянку таймлайну та рекомендацію щодо виправлення. Це економить години ручного аналізу та є однією з головних причин використовувати Systrace замість ручного логування.
Розробник може додавати власні мітки в Systrace-трейс через API Trace.beginSection та Trace.endSection. Це дозволяє простежити виконання критичних ділянок коду прямо на системному таймлайні — наприклад, відзначити початок та кінець завантаження даних або розрахунку макету. Мітки відображаються як окремі блоки на доріжці додатка та видимі поруч із системними подіями.
| Категорія | Дані | Типове застосування |
|---|---|---|
| sched | Перемикання контексту, idle-стани | Блокування потоків, конкуренція |
| gfx | VSync, підготовка буфера, HWC | Frame drops, jank |
| binder | Binder-транзакції, latency | IPC-затримки, віддалені виклики |
| freq | Частота CPU, scaling governor | Троттлінг, енергоспоживання |
| 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-розширення, щоб гарантувати закриття секції навіть при виключенні.
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-повідомлень та ключові метрики (frame rate, CPU usage, binder transactions). Розуміння структури звіту — ключовий навик для ефективного профілювання.
Таймлайн відображає час зліва направо. Кожен процес та потік — окрема доріжка. Клавіші W/S наближають/віддаляють, A/D переміщують за часом. Виділіть область мишею для збільшення ділянки. VSync-лінії показують межі кадрів (кожні 16.6 мс при 60 FPS). Якщо між двома VSync-лініями не вміщається повний цикл відтворення — кадр пропущено. Звертайте увагу на доріжку SurfaceFlinger: якщо вона довго зайнята (помаранчевий блок), значить, композиція шарів гальмує загальне відтворення.
Панель Alerts у лівій частині звіту містить автоматично виявлені проблеми. Кожен alert клікабельний — при кліку таймлайн переміщується до проблемного моменту. Найчастіші alert: «Long Sync» (довга синхронізація потоку), «Scheduling Delay» (затримка планувальника), «Buffer Overrun» (переповнення буфера SurfaceFlinger). Якщо alert показує значення ~100 мс для Scheduling Delay, це прямо вказує на те, що UI-потік чекав CPU через фонове навантаження — потрібно перенести важкі обчислення в Worker Thread.
Для аналізу пропущених кадрів увімкніть доріжки SurfaceFlinger та app.gfx. Кожен кадр відображається як прямокутник: зелений (≤16 мс), жовтий (16–32 мс), червоний (>32 мс). Якщо ви бачите червоний прямокутник на доріжці додатка, клікніть на нього — 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 мс, проблема в роздутті макету або прив’язці даних. Рішення: оптимізуйте макет (reduce deep ViewGroup, ViewStub), винесіть завантаження зображень у Glide з onAttachedToWindow.
Systrace з категорією freq та sched дозволяє побачити, як часто GC-цикли витісняють UI-потік. Знайдіть доріжку додатка на таймлайні — якщо ви бачите періодичні блоки тривалістю 20–50 мс з ім’ям «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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також