Android Profiler — це вбудований в Android Studio набір інструментів для моніторингу продуктивності застосунків у реальному часі. Він дозволяє відстежувати завантаження CPU, споживання пам'яті, мережевий трафік та енергоспоживання без встановлення сторонніх бібліотек. За даними Android Developers, профілювальник інтегрований безпосередньо в IDE та надає метрики з точністю до мілісекунди для будь-якого процесу на підключеному пристрої.
Головне
Android Profiler — це компонент Android Studio, який замінив застарілі Android Monitor та DDMS. Він надає єдиний інтерфейс для профілювання всіх аспектів застосунку: CPU Profiler для аналізу процесора, Memory Profiler для роботи з пам'яттю, Network Profiler для мережевих запитів та Energy Profiler для енергоспоживання. Дані збираються автоматично при запуску застосунку через Android Studio.
Профілювальник працює як на емуляторі, так і на фізичному пристрої, підключеному через USB. За даними Google I/O 2023, Android Profiler використовується більш ніж у 70% Android-проектів і вважається стандартним інструментом діагностики продуктивності. Головна перевага перед сторонніми рішеннями — нульова інтеграція: не потрібно додавати залежності в build.gradle або змінювати код застосунку.
Архітектура Android Profiler побудована на Perfetto — системному трасувальнику Android, який збирає дані на рівні ядра та застосунку. Perfetto забезпечує мінімальне навантаження (менше 1% CPU) та підтримує довгостроковий запис до 30 хвилин. Це дозволяє профілювати не тільки швидкі операції, але й тривалі сценарії — переходи між екранами, фонову синхронізацію, споживання пам'яті за годину використання.
Профілювальник збирає чотири типи даних: CPU — завантаження кожного ядра та потоку, Memory — Java Heap, Native Heap, Stack, Graphics, Network — всі вхідні та вихідні запити, Energy — категорії енергоспоживання (Idle, Light, Medium, Heavy). Дані синхронізовані за часовою шкалою — можна одночасно бачити, як зміна CPU впливає на Memory та енергоспоживання.
CPU Profiler показує завантаження процесора в реальному часі на часовій шкалі, розбиту за потоками застосунку. Кожен потік представлений кольоровою лінією або областю — чим ширша область, тим більше процесорного часу займає потік. Області червоного кольору означають роботу застосунку, синього — системні виклики, сірого — очікування.
Для детального аналізу CPU Profiler підтримує три режими запису: Trace Java Methods (трасування всіх методів Java), Trace C/C++ Functions (трасування нативних функцій NDK) та Sample Java Methods (семплювання, рекомендований режим). Семплювання дає найменше навантаження та підходить для щоденного профілювання, а повне трасування — для пошуку складних проблем.
// Приклад: аналіз CPU Profiler покаже цей метод як bottleneck
class DataProcessor {
suspend fun processLargeDataset(items: List<Item>): List<Result> {
// CPU Profiler покаже високе завантаження CPU в inBackgroundThread
return withContext(Dispatchers.Default) {
items.map { it.computeHeavyTransformation() }
}
}
}
// Рекомендація після профілювання:
// computeHeavyTransformation займає 80% часу — кешуємо результат
class DataProcessorOptimized {
private val cache = LruCache<String, Result>(100)
suspend fun processLargeDataset(items: List<Item>): List<Result> {
return withContext(Dispatchers.Default) {
items.mapNotNull { cache.get(it.id) ?: it.computeHeavyTransformation().also { cache.put(it.id, it) } }
}
}
}
Після запису CPU Profiler показує Top-Down Tree — дерево викликів із часом виконання кожного методу. Звертайте увагу на колонку Self Time/Total: якщо Self Time методу більше 16 мс і він викликається з UI-потоку — це гарантований пропуск кадру. Рішення — перенести важкі обчислення у фоновий потік через Dispatchers.IO або Default.
Sample Java Methods — рекомендований режим для щоденного профілювання з навантаженням 3–5%. Trace Java Methods — повне трасування кожного виклику, навантаження до 15%, використовується для коротких записів (5–10 секунд). Trace C/C++ Functions — трасування NDK-коду через Linux Perf, незамінний для аналізу ігор та бібліотек на C++. Перемикайте режими залежно від типу проблеми.
Memory Profiler відстежує всі категорії пам'яті застосунку: Java Heap (об'єкти JVM), Native Heap (алокації C/C++ через JNI), Stack (стеки потоків) та Graphics (текстури, буфери GPU). Основна візуалізація — часовий графік споживання пам'яті, де кожна категорія показана своїм кольором. Якщо графік не знижується після збирання сміття — підозрюйте витік.
Для пошуку витоків використовуйте функцію Capture Heap Dump. У момент дампу Android Profiler зупиняє застосунок на ~100 мс і створює HPROF-файл — повний знімок усіх живих об'єктів Java Heap. Після відкриття дампу ви можете сортувати об'єкти за Retained Size (об'єм пам'яті, який звільниться при видаленні об'єкта) та шукати екземпляри Activity, Fragment або Bitmap, які мали бути знищені.
За даними Google I/O 2022, Memory Profiler у зв'язці з LeakCanary покриває 95% сценаріїв виявлення витоків пам'яті на Android. LeakCanary працює автоматично — виявляє витік у фоні. Memory Profiler потрібен для ручного аналізу: ви бачите повну картину алокацій, а не тільки витоки.
| Категорія пам'яті | Опис | Типовий розмір |
|---|---|---|
| Java Heap | Куча JVM: об'єкти Kotlin/Java | 5–200 MB |
| Native Heap | Алокації через JNI, NDK | 1–100 MB |
| Graphics | Текстури, буфери GPU | 10–200 MB |
| Stack | Стеки всіх потоків | 1–10 MB |
Після захоплення дампу сортуйте об'єкти за Retained Size — це об'єм пам'яті, який звільниться при видаленні об'єкта. Шукайте екземпляри Activity, Fragment та Bitmap з великим Retained Size, які не повинні перебувати в пам'яті. Перейдіть на вкладку Reference Tree, щоб побачити ланцюжок посилань, що утримують об'єкт — найчастіше це статичне поле сінглтона або неочищений callback. Важлива метрика — Allocation rate (кількість алокацій за секунду). Якщо allocation rate перевищує 10 000 об'єктів/с, застосунок витрачає занадто багато часу на створення та видалення тимчасових об'єктів, що навантажує GC та викликає мікрофризи. У цьому випадку використовуйте інструмент View Inspector та знайдіть місця з частим створенням об'єктів у циклах.
Network Profiler відображає всі мережеві запити застосунку в реальному часі на часовій шкалі. Кожен запит показується у вигляді горизонтальної смуги — її довжина відповідає часу виконання, колір — типу запиту (GET, POST, PUT, DELETE). Прокрутка шкали дозволяє побачити, як запити розподілені в часі та чи не дублюються вони.
Підтримуються всі популярні бібліотеки: OkHttp, Retrofit, Volley, Ktor. Для Ktor та OkHttp профілювальник показує повний стек викликів, включаючи перехоплювачі (interceptors) та перетворювачі. Для кожного запиту доступні Заголовки запиту та Заголовки відповіді, тіло відповіді (до 1 MB), код статусу та тривалість.
Типові проблеми, які виявляє Network Profiler: відсутність кешування (той самий URL запитується при кожному відкритті), дубльовані запити (два компоненти одночасно завантажують однакові дані), надмірний розмір відповіді (сервер віддає 5 MB, коли потрібно 50 KB). Network Profiler допомагає побачити такі проблеми буквально за один погляд на часову шкалу.
Для емуляції повільних мереж використовуйте Network Conditioning в Android Studio — він дозволяє обмежити пропускну здатність до 3G/2G та додати затримку. Це критично важливо для тестування поведінки застосунку в поганих мережевих умовах, особливо для застосунків, що працюють у регіонах з нестабільним інтернетом.
Energy Profiler оцінює вплив застосунку на заряд батареї на основі даних Perfetto. Інструмент не вимірює фактичне споживання в міліамперах, а класифікує кожну операцію в одну з п'яти категорій енергоспоживання: Idle, Light, Medium, High та Overloaded. Часова шкала Energy Profiler підсвічується кольором: зелений (легке навантаження), жовтий (середнє), червоний (високе).
Основні причини появи червоних зон: WakeLock (застосунок утримує процесор активним), Location GPS (постійні запити координат з високою точністю), Keep-Alive з'єднання (часті обміни даними з сервером), великі передачі даних (відправлення файлів, стрімінг). Energy Profiler точно показує, яка операція в який момент часу викликала пік енергоспоживання.
За даними Android Developers, типовий застосунок має проводити не більше 5% часу в категорії High. Якщо Energy Profiler показує червоні зони довше 10% часу профілювання — застосунок не пройде перевірку за критерієм Battery Drain. Рекомендація — використовувати WorkManager для фонових завдань, обмежувати Location запити до мінімально необхідної точності та агрегувати мережеві запити в батчі.
Запуск Android Profiler виконується одним кліком: в Android Studio відкрийте View → Tool Windows → Profiler або двічі клікніть на іконку Profiler у правій панелі. Після запуску застосунку на підключеному пристрої Android Studio автоматично підключиться до процесу та почне збір даних. На часовій шкалі одразу з'являться графіки CPU, Memory, Network та Energy.
Для детального аналізу виберіть потрібну вкладку (CPU, Memory, Network або Energy) та почніть запис. Для CPU рекомендую режим Sample Java Methods з тривалістю запису 30 секунд — цього достатньо для типового сценарію. Для Memory — дамп купі після виконання сценарію (Capture Heap Dump). Для Network запис запускається автоматично, достатньо натиснути кнопку Stop після завершення сценарію.
Після зупинки запису експортуйте дані: File → Save As зберігає весь сеанс у файл .perf. Це зручно для порівняння метрик до та після оптимізації. Створіть baseline-сеанс на першій стабільній версії та порівнюйте з ним кожен новий сеанс — це єдиний спосіб об'єктивно оцінити зміни продуктивності.
Android Profiler можна запускати з командного рядка через Android Studio CLI та Firebase Test Lab. Firebase Test Lab підтримує профілювання продуктивності як частину UI-тестів: ви отримуєте метрики CPU, Memory та Network разом з результатом тесту. Налаштуйте пайплайн так, щоб при падінні метрик на 10% відносно baseline CI-пайплайн блокувався до перевірки розробником.
Поширені запитання
Вплив мінімальний. Android Profiler використовує Perfetto для збору даних, який додає менше 1% навантаження CPU. У режимі Sample Java Methods навантаження становить близько 3–5%, що несуттєво для сценарного профілювання. Повне трасування методів може давати навантаження до 15%, тому його використовують тільки для коротких записів.
Так, системні траси можна записати через Perfetto CLI безпосередньо з пристрою: adb shell perfetto --out /data/local/tmp/trace.perf. Потім відкрийте файл в інтерфейсі Perfetto UI (ui.perfetto.dev) або імпортуйте в Android Studio для перегляду з повною розміткою застосунку.
Android Profiler — це системний інструмент, який не потребує налаштування проксі. Показує запити прямо в IDE в контексті продуктивності. Charles Proxy — зовнішній проксі-сервер, що надає більш детальний аналіз (перехоплення трафіку, зміна запитів, повторне відправлення). Для профілювання продуктивності використовуйте Android Profiler, для аналізу API-контрактів — Charles.
Зробіть дамп купі до виконання сценарію (наприклад, до відкриття Activity). Виконайте сценарій — відкрийте Activity та закрийте її. Зробіть другий дамп. Порівняйте кількість живих екземплярів Activity: якщо в другому дампі їх більше — витік. Сортуйте за Retained Size, знайдіть зайві Activity та подивіться Reference Tree для з'ясування причини.
Energy Profiler потребує підтримки Power Profiles на рівні пристрою та Android 8.0+. На емуляторах та деяких прошивках (особливо китайських) дані можуть бути відсутні. Рішення — профілювати енергоспоживання на еталонних пристроях Pixel або Samsung з чистою прошивкою Android.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також