Підвищене споживання батареї — одна з найчастіших скарг користувачів мобільних застосунків. Застосунок починає споживати аномально багато енергії, викликаючи швидкий розряд пристрою навіть у фоновому режимі. За даними Google I/O 2023, до 30% застосунків у Google Play мають проблеми з енергоспоживанням, які безпосередньо впливають на утримання користувачів. У цій статті розберемо причини, діагностику та методи оптимізації.
Головне
Підвищене споживання батареї — це стан, при якому мобільний застосунок споживає значно більше енергії, ніж очікується при типовому сценарії використання. Користувач помічає, що пристрій розряджається на 20-30% швидше після встановлення або оновлення застосунку.
Сучасні мобільні ОС — Android та iOS — мають вбудовані механізми контролю енергоспоживання. Android використовує Battery Optimization, а iOS — фонові Background Modes. Однак неправильне використання API може обходити ці механізми.
За даними дослідження Purdue University (2021), близько 60% застосунків споживають енергію на фонові завдання без явної необхідності. Особливо це характерно для застосунків з рекламою, аналітикою та постійними мережевими з'єднаннями.
Енергоспоживання вимірюється в mA·h (міліампер-годинах). Android надає дані через BatteryManager API, який відстежує споживання кожним компонентом: CPU, радіо-модуль, GPS, дисплей та сенсори.
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
val chargeCounter = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER)
val capacity = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
// chargeCounter / capacity * 100 = current charge percentage
BatteryManager API дозволяє отримати поточний заряд та ємність батареї, але не надає подетальну інформацію по застосунках — для цього потрібні системні утиліти.
WakeLock — найнебезпечніший механізм для батареї. Якщо застосунок утримує WakeLock без звільнення, пристрій не переходить у режим сну. Кожна година утримання WakeLock споживає близько 50-80 mA·h.
Мережеві запити без пакетування — друга за частотою причина. Щоразу, коли застосунок встановлює мережеве з'єднання, радіо-модуль переходить з енергозберігаючого режиму в активний. Часті короткі запити з інтервалом менше 5 хвилин тримають радіо-модуль в активному стані постійно.
Визначення GPS-локації з високою точністю (GPS_PROVIDER) споживає в 10-15 разів більше енергії, ніж приблизне визначення (NETWORK_PROVIDER). Постійне оновлення локації в фоні — одна з головних скарг користувачів.
За даними Android Developers Blog, середній застосунок споживає близько 15% від загального споживання батареї пристрою. Перевищення цього рівня потребує обов'язкового аудиту енергоспоживання.
Battery Historian — офіційний інструмент Google для аналізу енергоспоживання. Він приймає дамп BatteryStats з ADB та візуалізує споживання за компонентами: CPU, Network, GPS, WakeLock та дисплей.
Для створення дампу виконайте команду: adb shell dumpsys batterystats. Після збору даних за 2-3 години нормального використання можна завантажити звіт у Battery Historian для аналізу.
Android Energy Profiler в Android Studio відстежує енергоспоживання в реальному часі. Він показує споживання CPU, Network, GPS та дисплею по кожній операції застосунку.
# Reset battery stats before test
adb shell dumpsys batterystats --reset
# Use the app for 2-3 hours
# Export dump for Battery Historian
adb shell dumpsys batterystats > batterystats_dump.txt
Для iOS використовується Energy Log через Xcode Instruments. Він збирає дані про споживання енергії з розбивкою по модулях: CPU, Network, GPU, Display, Location. Час читання: 15-30 хвилин на аналіз однієї сесії.
На фізичному пристрої iOS також показує статистику енергоспоживання в Settings > Battery. Якщо застосунок входить у топ-10 за споживанням — це сигнал для оптимізації.
WorkManager — стандартний API для фонових завдань, який враховує стан батареї, мережі та режим Doze. Він гарантує виконання завдання при оптимальних умовах, а не негайно, що економить до 40% енергії на фонових операціях.
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(
Constraints.Builder()
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.setRequiresNetworkType(NetworkType.CONNECTED)
.build()
)
.build()
WorkManager.getInstance(this).enqueue(workRequest)
Пакетування запитів — об'єднання декількох мережевих операцій в один сеанс зв'язку. Замість 10 окремих запитів застосунок виконує один пакетний запит, що знижує час активності радіо-модуля з 30 секунд до 2-3 секунд.
FusedLocationProviderClient від Google Play Services вибирає оптимальне джерело локації залежно від необхідної точності. Для фонових завдань використовуйте пріоритет PRIORITY_BALANCED_POWER_ACCURACY — це дає точність до 100 метрів при мінімальному споживанні батареї.
В iOS використовуйте Significant Location Change замість Continuous Location. Це дозволяє отримувати оновлення тільки при значному переміщенні (більше 500 метрів), а не кожні кілька секунд.
Android Battery Historian — веб-інструмент Google для візуалізації даних BatteryStats. Підтримує імпорт дампів, кольорове маркування компонентів та порівняння сесій. Основні метрики: час утримання WakeLock, активність радіо-модуля, GPS-сесії.
Xcode Energy Organizer збирає дані енергоспоживання від користувачів продакшену через TestFlight та App Store. Ви отримуєте звіт про середнє споживання на різних пристроях та версіях iOS. Це дозволяє відстежувати регресії після оновлень.
PerfDog (Tencent) — кроссплатформений інструмент для тестування продуктивності, що включає вимірювання енергоспоживання. Підтримує iOS та Android, дозволяє записувати показники з частотою 1-10 кадрів на секунду.
| Інструмент | Платформа | Метрики |
|---|---|---|
| Battery Historian | Android | WakeLock, Network, GPS, CPU, Display |
| Energy Profiler | Android Studio | CPU, Network, GPS, Radio в реальному часі |
| Energy Log | iOS (Xcode) | CPU, Network, GPU, Display, Location |
| PerfDog | iOS + Android | Енергія, FPS, CPU, Memory (всі разом) |
За даними Apple WWDC 2023, використання Energy Organizer дозволяє знизити середнє енергоспоживання застосунків на 15-25% за рахунок виявлення та усунення регресій до виходу оновлення в App Store.
Часті запитання
Соціальні мережі та месенджери (Facebook, Instagram, WhatsApp, Telegram) традиційно лідирують за енергоспоживанням. Вони постійно синхронізують дані, оновлюють стрічку, отримують push-повідомлення та використовують GPS. На другому місці — ігри з 3D-графікою, які навантажують GPU та CPU одночасно, споживаючи до 400-600 mA·h за годину активної гри.
Так, безпосередньо. Екран — найенергоємніший компонент смартфона. Підвищення частоти з 60 Гц до 120 Гц збільшує енергоспоживання дисплея на 30-50%. Однак сучасні дисплеї з LTPO-технологією динамічно змінюють частоту від 1 до 120 Гц залежно від контенту, що знижує вплив на батарею.
GPS з високою точністю споживає близько 200-300 mA·h за годину безперервної роботи. Для порівняння, визначення локації по Wi-Fi та вишках стільникового зв'язку (NETWORK_PROVIDER) споживає всього 20-40 mA·h за той же період. Використовуйте Geofencing API для включення GPS тільки при вході в задану область.
Не варто. Сучасні ОС (Android та iOS) оптимізують фонові процеси самі. Примусове закриття застосунку та повторний запуск споживають більше енергії, ніж якби застосунок залишався в фоні. Виняток — застосунки, які явно викликають проблеми (визначається через статистику батареї в налаштуваннях).
Відкрийте Settings > Battery > Battery Usage. Система покаже список застосунків з відсотком споживання. Для детального аналізу використовуйте ADB: adb shell dumpsys batterystats та завантажте дамп у Battery Historian. Це покаже не тільки загальне споживання, але й розбивку за компонентами (WakeLock, Network, GPS).
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також