Zwiększone zużycie baterii — jedna z najczęstszych skarg użytkowników aplikacji mobilnych. Aplikacja zaczyna zużywać nienormalnie dużo energii, powodując szybkie rozładowanie urządzenia nawet w trybie tła. Według Google I/O 2023, do 30% aplikacji w Google Play ma problemy z energochłonnością, bezpośrednio wpływające na utrzymanie użytkowników. W tym artykule omówimy przyczyny, diagnostykę i metody optymalizacji.
Najważniejsze
Zwiększone zużycie baterii — stan, w którym aplikacja mobilna zużywa znacznie więcej energii, niż oczekiwano w typowym scenariuszu użytkowania. Użytkownik zauważa, że urządzenie rozładowuje się o 20-30% szybciej niż zwykle po instalacji lub aktualizacji aplikacji.
Nowoczesne mobilne systemy operacyjne — Android i iOS — mają wbudowane mechanizmy kontroli zużycia energii. Android używa Battery Optimization, a iOS — tłowych Background Modes. Jednak nieprawidłowe użycie API może ominąć te mechanizmy.
Według badań Purdue University (2021), około 60% aplikacji zużywa energię na zadania w tle bez wyraźnej potrzeby. Jest to szczególnie charakterystyczne dla aplikacji z reklamami, analityką i stałymi połączeniami sieciowymi.
Zużycie energii mierzy się w mA·h (miliamperogodzinach). Android udostępnia dane przez BatteryManager API, który śledzi zużycie przez każdy komponent: CPU, moduł radiowy, GPS, wyświetlacz i czujniki.
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 = bieżący procent naładowania
BatteryManager API pozwala uzyskać aktualny poziom naładowania i pojemność baterii, ale nie zapewnia szczegółowych danych dla poszczególnych aplikacji — do tego potrzebne są narzędzia systemowe.
WakeLock — najniebezpieczniejszy mechanizm dla baterii. Jeśli aplikacja utrzymuje WakeLock bez zwolnienia, urządzenie nie przechodzi w tryb uśpienia. Każda godzina utrzymywania WakeLock zużywa około 50-80 mA·h.
Żądania sieciowe bez grupowania — druga najczęstsza przyczyna. Za każdym razem, gdy aplikacja ustanawia połączenie sieciowe, moduł radiowy przechodzi z trybu oszczędzania energii w aktywny. Częste krótkie żądania w odstępach krótszych niż 5 minut utrzymują moduł radiowy w stanie aktywnym ciągle.
Określanie lokalizacji GPS z wysoką dokładnością (GPS_PROVIDER) zużywa 10-15 razy więcej energii niż przybliżone określanie (NETWORK_PROVIDER). Ciągłe aktualizowanie lokalizacji w tle to jedna z głównych skarg użytkowników.
Według Android Developers Blog, przeciętna aplikacja zużywa około 15% całkowitego zużycia baterii urządzenia. Przekroczenie tego poziomu wymaga obowiązkowego audytu energochłonności.
Battery Historian — oficjalne narzędzie Google do analizy zużycia energii. Przyjmuje zrzut BatteryStats z ADB i wizualizuje zużycie według komponentów: CPU, Network, GPS, WakeLock i wyświetlacz.
Aby utworzyć zrzut, wykonaj polecenie: adb shell dumpsys batterystats. Po zebraniu danych przez 2-3 godziny normalnego użytkowania można załadować raport do Battery Historian w celu analizy.
Android Energy Profiler w Android Studio śledzi zużycie energii w czasie rzeczywistym. Pokazuje zużycie CPU, Network, GPS i wyświetlacza dla każdej operacji aplikacji.
# Zresetuj statystyki baterii przed testem
adb shell dumpsys batterystats --reset
# Używaj aplikacji przez 2-3 godziny
# Eksportuj zrzut do Battery Historian
adb shell dumpsys batterystats > batterystats_dump.txt
Dla iOS używa się Energy Log przez Xcode — Instruments. Zbiera dane o zużyciu energii z podziałem na moduły: CPU, Network, GPU, Display, Location. Czas odczytu: 15-30 minut na analizę jednej sesji.
Na fizycznym urządzeniu iOS również pokazuje statystyki zużycia energii w Ustawienia > Bateria. Jeśli aplikacja znajduje się w pierwszej dziesiątce pod względem zużycia — to sygnał do optymalizacji.
WorkManager — standardowe API do zadań w tle, które uwzględnia stan baterii, sieci i tryb Doze. Gwarantuje wykonanie zadania w optymalnych warunkach, a nie natychmiast, co oszczędza do 40% energii na operacjach w tle.
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(
Constraints.Builder()
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.setRequiresNetworkType(NetworkType.CONNECTED)
.build()
)
.build()
WorkManager.getInstance(this).enqueue(workRequest)
Grupowanie żądań — łączenie kilku operacji sieciowych w jedną sesję komunikacyjną. Zamiast 10 osobnych żądań aplikacja wykonuje jedno zbiorcze żądanie, co skraca czas aktywności modułu radiowego z 30 sekund do 2-3 sekund.
FusedLocationProviderClient od Google Play Services wybiera optymalne źródło lokalizacji w zależności od wymaganej dokładności. Do zadań w tle używaj priorytetu PRIORITY_BALANCED_POWER_ACCURACY — daje to dokładność do 100 metrów przy minimalnym zużyciu baterii.
W iOS używaj Significant Location Change zamiast Continuous Location. Pozwala to otrzymywać aktualizacje tylko przy znacznym przemieszczeniu (ponad 500 metrów), a nie co kilka sekund.
Android Battery Historian — narzędzie internetowe Google do wizualizacji danych BatteryStats. Obsługuje import zrzutów, kolorowe oznaczanie komponentów i porównywanie sesji. Główne metryki: czas utrzymywania WakeLock, aktywność modułu radiowego, sesje GPS.
Xcode Energy Organizer zbiera dane zużycia energii od użytkowników produkcyjnych przez TestFlight i App Store. Otrzymujesz raport o średnim zużyciu na różnych urządzeniach i wersjach iOS. Pozwala to śledzić regresje po aktualizacjach.
PerfDog (Tencent) — wieloplatformowe narzędzie do testowania wydajności, obejmujące pomiary zużycia energii. Obsługuje iOS i Android, pozwala rejestrować wskaźniki z częstotliwością 1-10 klatek na sekundę.
| Narzędzie | Platforma | Metryki |
|---|---|---|
| Battery Historian | Android | WakeLock, Network, GPS, CPU, Display |
| Energy Profiler | Android Studio | CPU, Network, GPS, Radio w czasie rzeczywistym |
| Energy Log | iOS (Xcode) | CPU, Network, GPU, Display, Location |
| PerfDog | iOS + Android | Energia, FPS, CPU, Memory (wszystkie razem) |
Według Apple WWDC 2023, użycie Energy Organiser pozwala zmniejszyć średnie zużycie energii aplikacji o 15-25% dzięki wykrywaniu i usuwaniu regresji przed wydaniem aktualizacji w App Store.
Często zadawane pytania
Sieci społecznościowe i komunikatory (Facebook, Instagram, WhatsApp, Telegram) tradycyjnie przodują pod względem zużycia energii. Ciągle synchronizują dane, aktualizują feed, otrzymują push i używają GPS. Na drugim miejscu — gry z grafiką 3D, które obciążają GPU i CPU jednocześnie, zużywając do 400-600 mA·h na godzinę aktywnej gry.
Tak, bezpośrednio. Ekran — najbardziej energochłonny komponent smartfona. Zwiększenie częstotliwości z 60 Hz do 120 Hz zwiększa zużycie energii wyświetlacza o 30-50%. Jednak nowoczesne wyświetlacze z technologią LTPO dynamicznie zmieniają częstotliwość od 1 do 120 Hz w zależności od treści, co zmniejsza wpływ na baterię.
GPS z wysoką dokładnością zużywa około 200-300 mA·h na godzinę ciągłej pracy. Dla porównania, określanie lokalizacji przez Wi-Fi i stacje bazowe (NETWORK_PROVIDER) zużywa tylko 20-40 mA·h w tym samym okresie. Używaj Geofencing API do włączania GPS tylko przy wejściu w określony obszar.
Nie warto. Nowoczesne systemy operacyjne (Android i iOS) optymalizują procesy w tle same. Wymuszone zamknięcie aplikacji i ponowne uruchomienie zużywa więcej energii, niż gdyby aplikacja pozostała w tle. Wyjątkiem są aplikacje, które jawnie powodują problemy (określa się to przez statystyki baterii w ustawieniach).
Otwórz Ustawienia > Bateria > Zużycie baterii. System pokaże listę aplikacji z procentem zużycia. Do szczegółowej analizy użyj ADB: adb shell dumpsys batterystats i załaduj zrzut do Battery Historian. To pokaże nie tylko całkowite zużycie, ale także podział na komponenty (WakeLock, Network, GPS).
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również