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 ms и той се извиква от нишката на 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 буфери). Основната визуализация е времева графика на потреблението на памет, където всяка категория е показана с различен цвят. Ако графиката не спада след почистването на паметта (garbage collection) — подозирайте теч.
За откриване на течове използвайте функцията Capture Heap Dump. В момента на дампа Android Profiler спира приложението за около 100 ms и създава 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 профилайлърът показва пълния стек от извиквания, включително интерцептори и конвертори. За всяка заявка са налични Request Headers и Response Headers, тялото на отговора (до 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също