Повишена консумация на батерия — един от най-честите оплаквания на потребителите на мобилни приложения. Приложението започва да консумира аномално много енергия, причинявайки бързо разреждане на устройството дори във фонов режим. Според 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 = текущ процент на зареждане
BatteryManager API позволява получаване на текущия процент на зареждане и капацитета на батерията, но не предоставя детайли по приложения — за това са необходими системни помощни програми.
WakeLock — най-опасният механизъм за батерията. Ако приложението задържа WakeLock без освобождаване, устройството не преминава в режим на сън. Всеки час на задържане на WakeLock консумира около 50-80 mA·h.
Мрежови заявки без групиране — втората най-честа причина. Всеки път, когато приложението установи мрежова връзка, радио-модулът преминава от енергоспестяващ режим в активен режим. Честите кратки заявки с интервал по-малък от 5 минути държат радио-модула постоянно в активно състояние.
Определянето на GPS локация с висока точност (GPS_PROVIDER) консумира 10-15 пъти повече енергия от приблизителното определяне (NETWORK_PROVIDER). Постоянното актуализиране на локацията във фонов режим е едно от основните оплаквания на потребителите.
Според Android Developers Blog, средното приложение консумира около 15% от общата консумация на батерия на устройството. Превишаването на това ниво изисква задължителен енергиен одит.
Battery Historian — официалният инструмент на Google за анализ на енергийната консумация. Той приема dump на BatteryStats от ADB и визуализира консумацията по компоненти: CPU, Мрежа, GPS, WakeLock и дисплей.
За да създадете dump, изпълнете командата: adb shell dumpsys batterystats. След събиране на данни за 2-3 часа нормална употреба, можете да заредите отчета в Battery Historian за анализ.
Android Energy Profiler в Android Studio проследява енергийната консумация в реално време. Показва консумацията на CPU, Мрежа, GPS и дисплей за всяка операция на приложението.
# Нулирайте статистиката на батерията преди теста
adb shell dumpsys batterystats --reset
# Използвайте приложението 2-3 часа
# Експортирайте dump за Battery Historian
adb shell dumpsys batterystats > batterystats_dump.txt
За iOS се използва Energy Log чрез Xcode — Instruments. Той събира данни за енергийната консумация, разпределени по модули: CPU, Мрежа, GPU, Дисплей, Локация. Време за четене: 15-30 минути за анализ на една сесия.
На физическо iOS устройство статистиката за енергийната консумация се показва и в Настройки > Батерия. Ако приложението е в топ 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. Поддържа импорт на dump-ове, цветно кодиране на компоненти и сравняване на сесии. Основни метрики: време на задържане на WakeLock, активност на радио-модула, GPS сесии.
Xcode Energy Organizer събира данни за енергийна консумация от потребители на продукция чрез TestFlight и App Store. Получавате отчет за средната консумация на различни устройства и версии на iOS. Това позволява проследяване на регресии след актуализации.
PerfDog (Tencent) — междуплатформен инструмент за тестване на производителност, включващ измервания на енергийна консумация. Поддържа iOS и Android, позволява запис на показатели с честота 1-10 кадъра в секунда.
| Инструмент | Платформа | Метрики |
|---|---|---|
| Battery Historian | Android | WakeLock, Мрежа, GPS, CPU, Дисплей |
| Energy Profiler | Android Studio | CPU, Мрежа, GPS, Радио в реално време |
| Energy Log | iOS (Xcode) | CPU, Мрежа, GPU, Дисплей, Локация |
| PerfDog | iOS + Android | Енергия, FPS, CPU, Памет (всички заедно) |
Според Apple WWDC 2023, използването на Energy Organiser позволява намаляване на средната енергийна консумация на приложенията с 15-25% чрез идентифициране и отстраняване на регресии преди пускането на актуализацията в App Store.
Често задавани въпроси
Социалните мрежи и месинджъри (Facebook, Instagram, WhatsApp, Telegram) традиционно водят по енергийна консумация. Те постоянно синхронизират данни, актуализират новинарския поток, получават push известия и използват GPS. На второ място — игрите с 3D графика, които едновременно натоварват GPU и CPU, консумирайки до 400-600 mA·h на час активна игра.
Да, пряко. Екранът — най-енергоемкият компонент на смартфона. Повишаването на честотата от 60 Hz на 120 Hz увеличава енергийната консумация на дисплея с 30-50%. Въпреки това, съвременните дисплеи с LTPO технология динамично променят честотата от 1 до 120 Hz в зависимост от съдържанието, което намалява влиянието върху батерията.
GPS с висока точност консумира около 200-300 mA·h на час непрекъсната работа. За сравнение, определянето на локация чрез Wi-Fi и мобилни базови станции (NETWORK_PROVIDER) консумира само 20-40 mA·h за същия период. Използвайте Geofencing API за включване на GPS само при влизане в определена зона.
Не си струва. Съвременните операционни системи (Android и iOS) сами оптимизират фоновите процеси. Принудителното затваряне на приложението и повторното му стартиране консумира повече енергия, отколкото ако приложението беше останало на фон. Изключение — приложения, които явно причиняват проблеми (определя се чрез статистиката на батерията в настройките).
Отворете Настройки > Батерия > Използване на батерията. Системата ще покаже списък с приложения и процента на консумация. За подробен анализ използвайте ADB: adb shell dumpsys batterystats и заредете dump-а в Battery Historian. Това ще покаже не само общата консумация, но и разбивката по компоненти (WakeLock, Мрежа, GPS).
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също