Przesyłanie danych przez radio bezprzewodowe może być jednym z najważniejszych źródeł zużycia baterii przez aplikację. Aby zminimalizować zużycie baterii związane z aktywnością sieciową, musisz wiedzieć, jak model połączenia wpływa na sprzęt radiowy.
W tej sekcji przedstawiamy maszynę stanów radia bezprzewodowego i wyjaśniamy, jak model połączeń aplikacji współdziała z nią. Następnie przedstawia kilka technik, które pomogą zminimalizować wpływ zużycia danych przez aplikację na baterię.
Maszyna stanowa radia
Moduł radiowy w urządzeniu użytkownika ma wbudowane funkcje oszczędzania energii, które pomagają zminimalizować zużycie baterii. Gdy jest w pełni aktywny, zużywa znaczną ilość energii, ale gdy jest nieaktywny lub w trybie gotowości, zużywa jej bardzo mało.
Pamiętaj, że radio nie może natychmiast przejść z trybu gotowości do trybu pełnej aktywności. Z „uruchamianiem” radia wiąże się okres oczekiwania. Dlatego bateria powoli przechodzi ze stanów wyższego zużycia energii do stanów niższego zużycia, aby oszczędzać energię, gdy urządzenie nie jest używane, a jednocześnie zminimalizować opóźnienie związane z „włączaniem” radia.
Maszyna stanowa typowego radia sieci 3G składa się z 3 stanów energetycznych:
- Pełna moc: używana, gdy połączenie jest aktywne, co pozwala urządzeniu przesyłać dane z najwyższą możliwą szybkością.
- Niski pobór mocy: stan pośredni, który zmniejsza zużycie energii z baterii o około 50%.
- Tryb gotowości: stan minimalnego zużycia energii, podczas którego nie ma aktywnego połączenia sieciowego.
Chociaż stany niskiego zużycia energii i gotowości znacznie mniej obciążają baterię, powodują też znaczne opóźnienia w żądaniach sieciowych. Powrót do pełnej mocy ze stanu niskiego poboru energii zajmuje około 1,5 sekundy, a przejście z trybu gotowości do pełnej mocy może potrwać ponad 2 sekundy.
Aby zminimalizować czas oczekiwania, maszyna stanowa używa opóźnienia, aby odłożyć przejście do stanów o niższym zużyciu energii. Rysunek 1 przedstawia czasy AT&T dla typowego radia 3G.
Rysunek 1. Typowy automat stanu radia bezprzewodowego 3G.
Maszyna stanów modułu radiowego na każdym urządzeniu, a zwłaszcza powiązane z nią opóźnienie przejścia („czas ogona”) i opóźnienie uruchomienia, różnią się w zależności od zastosowanej technologii radiowej (3G, LTE, 5G itd.) i są definiowane oraz konfigurowane przez sieć operatora, w której działa urządzenie.
Na tej stronie opisano reprezentatywną maszynę stanów dla typowego radia bezprzewodowego 3G na podstawie danych dostarczonych przez AT&T. Jednak ogólne zasady i wynikające z nich sprawdzone metody mają zastosowanie do wszystkich implementacji radia bezprzewodowego.
To podejście jest szczególnie skuteczne w przypadku typowego przeglądania internetu mobilnego, ponieważ zapobiega niepożądanym opóźnieniom podczas przeglądania stron przez użytkowników. Stosunkowo krótki czas oczekiwania gwarantuje też, że po zakończeniu sesji przeglądania radio może przejść w stan niższego zużycia energii.
Niestety takie podejście może prowadzić do nieefektywnego działania aplikacji w nowoczesnych systemach operacyjnych smartfonów, takich jak Android, gdzie aplikacje działają zarówno na pierwszym planie (gdzie liczy się czas oczekiwania), jak i w tle (gdzie priorytetem powinien być czas pracy na baterii).
Jak aplikacje wpływają na maszynę stanów radia
Za każdym razem, gdy tworzysz nowe połączenie sieciowe, radio przechodzi w stan pełnego zasilania. W przypadku typowego automatu stanu radia 3G opisanego wcześniej będzie on działał z pełną mocą przez cały czas trwania transferu, a następnie przez dodatkowe 5 sekund czasu końcowego, po czym przez 12 sekund będzie w stanie niskiego zużycia energii. W przypadku typowego urządzenia 3G każda sesja przesyłania danych powoduje, że radio pobiera energię przez co najmniej 18 sekund.
W praktyce oznacza to, że aplikacja, która przesyła dane przez 1 sekundę 3 razy na minutę, będzie stale utrzymywać aktywność modułu radiowego, przełączając go w tryb wysokiego poboru mocy, gdy tylko wejdzie on w tryb czuwania.
Rysunek 2. Względne zużycie energii przez radio bezprzewodowe podczas 1-sekundowego transferu uruchamianego 3 razy na minutę. Liczba nie uwzględnia opóźnienia „uruchamiania” między uruchomieniami.
Dla porównania, jeśli ta sama aplikacja połączyłaby przesyłanie danych, wykonując jeden 3-sekundowy transfer co minutę, moduł radiowy byłby w stanie wysokiego poboru energii tylko przez 20 sekund na minutę. Dzięki temu radioodbiornik może być w trybie gotowości przez 40 sekund każdej minuty, co znacznie zmniejsza zużycie baterii.
Rysunek 3. Względne wykorzystanie energii przez radio bezprzewodowe podczas 3-sekundowych transferów wykonywanych raz na minutę.
Techniki optymalizacji
Teraz, gdy już wiesz, jak dostęp do sieci wpływa na czas pracy na baterii, omówimy kilka sposobów na zmniejszenie zużycia baterii przy jednoczesnym zapewnieniu szybkiego i płynnego działania aplikacji.
Przenoszenie danych pakietu
Jak wspomnieliśmy w poprzedniej sekcji, grupowanie przesyłania danych, aby przesyłać więcej danych rzadziej, to jeden z najlepszych sposobów na zwiększenie wydajności baterii.
Oczywiście nie zawsze jest to możliwe, jeśli aplikacja musi natychmiast odebrać lub wysłać dane w odpowiedzi na działanie użytkownika. Możesz temu zapobiec, przewidując i pobierając dane z wyprzedzeniem. Inne scenariusze, takie jak wysyłanie dzienników lub statystyk na serwer i inne, niepilne, zainicjowane przez aplikację transfery danych, bardzo dobrze nadają się do grupowania i łączenia. Wskazówki dotyczące planowania transferów sieciowych w tle znajdziesz w sekcji Optymalizowanie zadań inicjowanych przez aplikacje.
Pobieranie danych z wyprzedzeniem
Wstępne pobieranie danych to kolejny skuteczny sposób na zmniejszenie liczby niezależnych sesji przesyłania danych, które uruchamia aplikacja. Dzięki pobieraniu z wyprzedzeniem, gdy użytkownik wykonuje działanie w aplikacji, aplikacja przewiduje, które dane będą najprawdopodobniej potrzebne do wykonania kolejnej serii działań użytkownika, i pobiera je w jednej serii, przez jedno połączenie, z pełną wydajnością.
Przez wstępne wczytywanie transferów zmniejszasz liczbę aktywacji modułu radiowego wymaganych do pobrania danych. Dzięki temu nie tylko oszczędzasz baterię, ale też zmniejszasz opóźnienia, obniżasz wymaganą przepustowość i skracasz czas pobierania.
Pobieranie z wyprzedzeniem poprawia też wrażenia użytkowników, ponieważ minimalizuje opóźnienia w aplikacji spowodowane oczekiwaniem na zakończenie pobierania przed wykonaniem działania lub wyświetleniem danych.
Oto praktyczny przykład.
czytnik wiadomości,
Wiele aplikacji z wiadomościami próbuje zmniejszyć wykorzystanie przepustowości, pobierając nagłówki dopiero po wybraniu kategorii, pełne artykuły tylko wtedy, gdy użytkownik chce je przeczytać, a miniatury dopiero wtedy, gdy pojawią się na ekranie.
W tym przypadku moduł radiowy musi pozostać aktywny przez większość sesji czytania wiadomości, gdy użytkownicy przewijają nagłówki, zmieniają kategorie i czytają artykuły. Co więcej, ciągłe przełączanie się między stanami energii powoduje znaczne opóźnienia podczas przełączania kategorii lub czytania artykułów.
Lepszym rozwiązaniem jest pobranie wstępne rozsądnej ilości danych podczas uruchamiania, zaczynając od pierwszego zestawu nagłówków i miniatur wiadomości (co zapewnia krótki czas uruchamiania), a następnie pobranie pozostałych nagłówków i miniatur oraz tekstu każdego artykułu dostępnego przynajmniej na liście głównych nagłówków.
Inną opcją jest wstępne pobieranie wszystkich nagłówków, miniatur, tekstów artykułów, a nawet pełnych zdjęć artykułów – zwykle w tle według wcześniej ustalonego harmonogramu. Takie podejście wiąże się z ryzykiem zużycia znacznej przepustowości i baterii na pobieranie treści, które nigdy nie zostaną wykorzystane, dlatego należy je wdrażać z ostrożnością.
Uwagi dodatkowe
Chociaż pobieranie z wyprzedzeniem ma wiele zalet, zbyt agresywne korzystanie z tej funkcji może zwiększyć zużycie baterii i przepustowości, a także limitu pobierania, ponieważ pobierane są dane, które nie są używane. Ważne jest też, aby pobieranie z wyprzedzeniem nie opóźniało uruchamiania aplikacji, gdy czeka ona na zakończenie tego procesu. W praktyce może to oznaczać stopniowe przetwarzanie danych lub inicjowanie kolejnych transferów z priorytetem, tak aby dane wymagane do uruchomienia aplikacji były pobierane i przetwarzane jako pierwsze.
To, jak agresywnie pobierasz dane z wyprzedzeniem, zależy od rozmiaru pobieranych danych i prawdopodobieństwa ich wykorzystania. Zgodnie z opisaną wcześniej maszyną stanów, w przypadku danych, które mają 50% szans na wykorzystanie w bieżącej sesji użytkownika, można zwykle pobrać z wyprzedzeniem około 6 sekund (około 1–2 megabajtów), zanim potencjalny koszt pobrania nieużywanych danych zrówna się z potencjalnymi oszczędnościami wynikającymi z niepobierania tych danych.
Ogólnie rzecz biorąc, dobrą praktyką jest wstępne pobieranie danych, tak aby kolejne pobieranie było konieczne tylko co 2–5 minut i obejmowało od 1 do 5 megabajtów.
Zgodnie z tą zasadą duże pliki, np. filmy, powinny być pobierane we fragmentach w regularnych odstępach czasu (co 2–5 minut), co pozwala na pobieranie z wyprzedzeniem tylko tych danych wideo, które prawdopodobnie zostaną wyświetlone w ciągu najbliższych kilku minut.
Jednym z rozwiązań jest zaplanowanie pełnego pobierania tylko wtedy, gdy urządzenie jest połączone z Wi-Fi, a być może tylko wtedy, gdy jest ładowane. Interfejs WorkManager API obsługuje dokładnie ten przypadek użycia, umożliwiając ograniczenie pracy w tle, dopóki urządzenie nie spełni kryteriów określonych przez dewelopera, takich jak ładowanie i połączenie z Wi-Fi.
Sprawdzanie połączenia przed wysłaniem żądań
Wyszukiwanie sygnału komórkowego to jedna z najbardziej energochłonnych operacji na urządzeniu mobilnym. W przypadku żądań inicjowanych przez użytkownika sprawdzoną metodą jest najpierw sprawdzenie połączenia za pomocą metody ConnectivityManager, jak pokazano w sekcji Monitorowanie stanu połączenia i pomiaru wykorzystania danych.
Jeśli nie ma sieci, aplikacja może oszczędzać baterię, nie wymuszając wyszukiwania przez moduł radiowy. Żądanie może zostać zaplanowane i wykonane w ramach zbiorczego przetwarzania z innymi żądaniami po nawiązaniu połączenia.
Połączenia z pulą
Dodatkową strategią, która może pomóc oprócz grupowania i pobierania z wyprzedzeniem, jest grupowanie połączeń sieciowych aplikacji.
Ponowne używanie istniejących połączeń sieciowych jest zwykle bardziej efektywne niż inicjowanie nowych. Ponowne używanie połączeń pozwala też sieci na bardziej inteligentne reagowanie na przeciążenia i powiązane problemy z danymi sieciowymi.
HttpURLConnection i większość klientów HTTP, takich jak OkHttp, domyślnie włącza grupowanie połączeń i używa tego samego połączenia do obsługi wielu żądań.
Podsumowanie i plany na przyszłość
W tej sekcji dowiedziałeś się wiele o radiu bezprzewodowym i niektórych strategiach, które możesz stosować, aby zapewnić szybkie i płynne działanie aplikacji przy jednoczesnym zmniejszeniu zużycia baterii.
W następnej sekcji szczegółowo omówimy 3 różne typy interakcji sieciowych, które występują w większości aplikacji. Poznasz czynniki wpływające na każdy z tych typów, a także nowoczesne techniki i interfejsy API do efektywnego zarządzania tymi interakcjami.