Optymalizacja dostępu do sieci

Korzystanie z radia bezprzewodowego do przesyłania danych może być jednym z największych źródeł zużycia baterii przez aplikację. Aby zminimalizować zużycie baterii związane z aktywizacją sieci, musisz zrozumieć, jak Twój model łączności wpłynie na sprzęt radiowy.

W tej sekcji przedstawiamy maszynę stanów radiowych i objaśniamy, jak model łączności aplikacji współdziała z tą maszyną. Następnie przedstawia kilka technik, które pozwolą zminimalizować wpływ zużycia danych przez aplikację na baterię.

Maszyna stanów radia

Bezprzewodowe radio na urządzeniu użytkownika ma wbudowane funkcje oszczędzania energii, które pomagają zminimalizować zużycie energii z baterii. W pełni aktywne radio bezprzewodowe zużywa znaczną ilość energii, ale w stanie nieaktywnym lub w stanie gotowości zużywa bardzo mało energii.

Pamiętaj, że radio nie może przejść z trybu gotowości do pełnej aktywności w chwilę. Czas oczekiwania jest związany z „włączaniem” radia. Dlatego bateria przechodzi z wyższych stanów energii do niższych stanów energii powoli, aby oszczędzać energię, gdy nie jest używana, jednocześnie starając się zminimalizować opóźnienie związane z „włączaniem” radia.

Maszyna stanów dla typowego radia sieci 3G składa się z 3 stanów energii:

  • Pełna moc: używana, gdy połączenie jest aktywne, co pozwala urządzeniu przesyłać dane z największą możliwą szybkością.
  • Niski poziom energii: stan pośredni, który zmniejsza zużycie energii przez baterię o około 50%.
  • Tryb gotowości: stan minimalnego poboru mocy, w którym nie jest aktywne żadne połączenie sieciowe.

Chociaż stany niski i w trybie gotowości zużywają znacznie mniej energii, powodują też znaczne opóźnienia w zapytaniach sieciowych. Powrót do pełnej mocy z poziomu niskiego zajmuje około 1,5 sekundy, a przejście z stanu gotowości do pełnej mocy może zająć ponad 2 sekundy.

Aby zminimalizować opóźnienie, maszyna stanów używa opóźnienia, aby opóźnić przejście do stanów o mniejszym zużyciu energii. Rysunek 1 przedstawia opóźnienia AT&T dla typowego radia 3G.


Rysunek 1. Typowa maszyna stanów bezprzewodowego radia 3G.

Maszyna stanów radiowych na każdym urządzeniu, w szczególności powiązane opóźnienie przejścia („czas ogonowy”) i opóźnienie uruchamiania, będzie się różnić w zależności od zastosowanej technologii radiowej (3G, LTE, 5G itd.) i jest definiowana i konfigurowana przez sieć operatora, w której działa urządzenie.

Na tej stronie opisano reprezentatywny stan maszyny dla typowego bezprzewodowego radia 3G na podstawie danych dostarczonych przez firmę AT&T. Jednak ogólne zasady i wynikające z nich sprawdzone metody są stosowane we wszystkich implementacjach radia bezprzewodowego.

To podejście jest szczególnie skuteczne w przypadku zwykłego przeglądania internetu na urządzeniach mobilnych, ponieważ zapobiega niechcianym opóźnieniom podczas przeglądania internetu. Dzięki stosunkowo krótkiemu czasowi opóźnienia po zakończeniu sesji przeglądania radio może przejść w stan zużycia mniejszej ilości energii.

Takie podejście może jednak prowadzić do nieefektywnego działania aplikacji na nowoczesnych systemach operacyjnych, takich jak Android, w których aplikacje działają zarówno na pierwszym planie (gdzie ważna jest opóźnienie) jak i w tle (gdzie priorytetem jest czas pracy na baterii).

Jak aplikacje wpływają na maszynę stanu radia

Za każdym razem, gdy tworzysz nowe połączenie z siecią, radio przechodzi w stan pełnej mocy. W przypadku typowego sterownika stanu radia 3G opisanego wcześniej będzie on działać z pełną mocą przez cały czas przesyłania danych (plus dodatkowe 5 sekund na czas zakończenia) i przez 12 sekund 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 trzy razy na minutę prześle 1 sekundę danych, będzie utrzymywać radio bezprzewodowe w stanie ciągłej aktywności, co spowoduje, że w momencie przejścia w tryb gotowości znów przejdzie w tryb wysokiej mocy.


Rysunek 2. Względne zużycie energii radiowej w przypadku przenoszenia danych przez bezprzewodową sieć radiową w ciągu 1 sekundy, które odbywa się 3 razy na minutę. Rysunek nie uwzględnia opóźnienia związanego z „doładowaniem” między testami.

Jeśli ta sama aplikacja spakowałaby swoje transfery danych, wykonując jeden transfer trwający 3 sekundy co minutę, radio pozostałoby w stanie wysokiej mocy przez łącznie tylko 20 sekund na minutę. Pozwoli to radiu działać w stanie gotowości przez 40 sekund w ciągu każdej minuty, co znacznie zmniejszy zużycie baterii.


Rysunek 3. Względne zużycie energii w zakresie częstotliwości radiowych w przypadku transferów trwających 3 sekundy, które są wykonywane raz na minutę.

Techniki optymalizacji

Teraz, gdy już wiesz, jak dostęp do sieci wpływa na czas pracy baterii, omówimy kilka sposobów na ograniczenie zużycia baterii przy jednoczesnym zapewnieniu szybkiego i płynnego działania.

Przenoszenie danych w pakiecie

Jak wspomnieliśmy w poprzedniej sekcji, grupowanie transferów danych w celu rzadszego przesyłania większej ilości danych jest jednym z najlepszych sposobów na zwiększenie efektywności baterii.

Nie zawsze jest to możliwe, jeśli aplikacja musi otrzymać lub wysłać dane natychmiast 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 danych analitycznych na serwer oraz inne niepilne przesyłanie danych inicjowane przez aplikację, doskonale nadają się do grupowania i zbiorczości. Więcej informacji o planowaniu transferów sieciowych w tle znajdziesz w artykule Optymalizowanie zadań inicjowanych przez aplikację.

pobieranie z wyprzedzeniem danych,

Pobieranie danych w poprzednim etapie to kolejny skuteczny sposób na zmniejszenie liczby niezależnych sesji przesyłania danych, które uruchamia aplikacja. Gdy użytkownik wykonuje działanie w aplikacji, aplikacja przewiduje, które dane będą najprawdopodobniej potrzebne do następnej serii działań użytkownika, i pobiera te dane w jednym wysypie, korzystając z jednego połączenia z pełną prędkością.

Dzięki wstępnemu przenoszeniu transferów możesz zmniejszyć liczbę aktywacji radiowych wymaganych do pobrania danych. Dzięki temu nie tylko oszczędzasz czas pracy baterii, ale też skracasz opóźnienia, zmniejszasz wymaganą przepustowość i skracasz czas pobierania.

Wstępne pobieranie usprawnia też działanie aplikacji, ponieważ minimalizuje opóźnienia spowodowane oczekiwaniem na zakończenie pobierania przed wykonaniem działania lub wyświetleniem danych.

Oto praktyczny przykład.

Czytnik wiadomości

Wiele aplikacji informacyjnych stara się ograniczyć 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.

Dzięki temu radio pozostaje aktywne przez większość sesji czytania wiadomości, gdy użytkownicy przewijają nagłówki, zmieniają kategorie i czytają artykuły. Co więcej, częste przełączanie się między stanami energii powoduje znaczne opóźnienia podczas przełączania się między kategoriami lub czytania artykułów.

Lepszym rozwiązaniem jest pobieranie w ramach wstępnego pobierania danych odpowiedniej ilości danych na starcie, zaczynając od pierwszego zestawu nagłówków i miniatur wiadomości (co zapewni krótki czas uruchamiania), a następnie kontynuując z pozostałymi nagłówkami i miniaturami oraz tekstem artykułu dostępnym z co najmniej podstawowej listy nagłówków.

Inną opcją jest wstępne pobieranie każdego nagłówka, miniatury, tekstu artykułu, a czasem nawet zdjęć do artykułu – zwykle w tle według z góry określonego harmonogramu. Takie podejście może wiązać się z poważnym zużyciem przepustowości i czasu pracy baterii na pobieranie treści, których nigdy nie używasz, dlatego należy je stosować z ostrożnością.

Dodatkowe uwagi

Chociaż pobieranie danych w ramach przewidywania zapotrzebowania przynosi wiele korzyści, zbyt agresywne korzystanie z tego rozwiązania może też zwiększać zużycie baterii i pasma, a także zużycie limitu pobierania danych przez pobieranie danych, których nie używasz. Musisz też zadbać o to, aby pobieranie wstępnie nie opóźniało uruchamiania aplikacji, gdy ta czeka na zakończenie pobierania wstępnie. W praktyce może to oznaczać stopniowe przetwarzanie danych lub inicjowanie kolejnych transferów w taki sposób, aby dane wymagane do uruchomienia aplikacji były pobierane i przetwarzane w pierwszej kolejności.

Agresywność pobierania danych zależy od rozmiaru pobieranych danych i prawdopodobieństwo ich użycia. Zgodnie z opracowanym wcześniej modelem maszyny stanów, w przypadku danych, które mają 50% prawdopodobieństwo użycia w ramach bieżącej sesji użytkownika, możesz zwykle pobrać dane w ramach wstępnie 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, dobrym zwyczajem jest pobieranie danych w tle, aby trzeba było inicjować kolejne pobieranie tylko co 2–5 minut i o rozmiarze około 1–5 megabajtów.

Zgodnie z tą zasadą duże pliki do pobrania, takie jak pliki wideo, powinny być pobierane w kawałkach w regularnych odstępach czasu (co 2–5 minut), co pozwala na pobieranie w poprzednim wyszukiwaniu tylko danych wideo, które prawdopodobnie zostaną wyświetlone w ciągu kilku minut.

Jednym z rozwiązań jest zaplanowanie pełnego pobierania tylko wtedy, gdy urządzenie jest połączone z Wi-Fi, a ewentualnie tylko wtedy, gdy jest ładowane. Interfejs WorkManager API obsługuje dokładnie ten przypadek użycia, umożliwiając ograniczenie pracy w tle do momentu, gdy urządzenie spełni określone przez dewelopera kryteria, takie jak ładowanie i połączenie z Wi-Fi.

Sprawdzanie łączności przed wysyłaniem żądań

Wyszukiwanie sygnału komórkowego to jedna z najbardziej energochłonnych operacji na urządzeniu mobilnym. Sprawdzoną metodą w przypadku żądań inicjowanych przez użytkownika jest najpierw sprawdzenie połączenia za pomocą ConnectivityManager, jak pokazano w sekcji Monitorowanie stanu łączności i sterowanie łącznością. Jeśli nie ma sieci, aplikacja może oszczędzać baterię, nie wymuszając wyszukiwania przez radio. Po nawiązaniu połączenia prośbę można zaplanować i wykonać w grupie razem z innymi prośbami.

Połączenia z pulą

Dodatkową strategią, która może być przydatna oprócz grupowania i pobierania wstępnego, jest grupowanie połączeń sieciowych aplikacji.

Ogólnie rzecz biorąc, ponowne używanie istniejących połączeń sieciowych jest bardziej wydajne niż inicjowanie nowych. Dzięki temu sieć może też inteligentniej reagować na przeciążenia i powiązane z nimi problemy z danymi sieciowymi.

HttpURLConnection i większość klientów HTTP, takich jak OkHttp, domyślnie włączają łączenie połączeń i ponowne wykorzystywanie tego samego połączenia do wysyłania wielu żądań.

Podsumowanie i perspektywy

W tej sekcji dowiesz się wiele o radiu bezprzewodowym oraz o kilku strategiach, które możesz stosować na szeroką skalę, aby zapewnić użytkownikom szybkie i wygodne działanie aplikacji przy jednoczesnym ograniczeniu zużycia baterii.

W następnej sekcji szczegółowo omówimy 3 typy interakcji z siecią, które są wspólne dla większości aplikacji. Poznasz czynniki wpływające na każdy z tych typów interakcji, a także nowoczesne techniki i interfejsy API, które ułatwiają ich skuteczne zarządzanie.