Optymalizacja dostępu do sieci

Korzystanie z przesyłania danych przez łącze bezprzewodowe 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

Radio bezprzewodowe 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 najwyższą 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. Typowy stan maszyny radiowej 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 opisujemy reprezentatywny automat stanów dla typowego bezprzewodowego radia 3G na podstawie danych dostarczonych przez 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 ogonów po zakończeniu sesji przeglądania radio może przejść w stan zużycia mniejszej ilości energii.

Takie podejście może jednak spowodować nieefektywną pracę aplikacji na nowoczesnych systemach operacyjnych takich jak Android, w których aplikacje działają zarówno na pierwszym planie (gdzie ważna jest szybkość reakcji), 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 czasu ogonowego), a następnie 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 trzy razy na minutę prześle dane w ciągu 1 sekundy, 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 w sieci bezprzewodowej podczas przesyłania trwającego 1 sekundę i wykonywanego 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 3-sekundowy transfer 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 na baterii, omówimy kilka kwestii, które pomogą Ci zmniejszyć zużycie baterii, a zarazem zapewnią szybkie i płynne działanie aplikacji.

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.

Oczywiście 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,

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 wykonania kolejnej serii działań przez użytkownika, i pobiera te dane w jednym wystrzałowym strumieniu za pomocą jednego połączenia z pełną szybkoś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 baterię, 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ę ograniczać 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 i czytania artykułów.

Lepszym rozwiązaniem jest pobieranie w ramach wstępnego pobierania danych odpowiedniej ilości danych na początku, zaczynając od pierwszego zestawu nagłówków i miniatur wiadomości (co zapewni krótki czas uruchamiania), a następnie kontynuując z użyciem pozostałych nagłówków i miniatur oraz tekstu artykułu z co najmniej pierwotnej listy nagłówków.

Inną opcją jest wstępne pobieranie każdego nagłówka, miniatury, tekstu artykułu, a czasem nawet pełnych zdjęć artykułów – 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ą.

Inne rzeczy, które warto wziąć pod uwagę

Chociaż pobieranie danych w ramach przewidywania zapotrzebowania przynosi wiele korzyści, zbyt agresywne korzystanie z tego rozwiązania może też prowadzić do zwiększonego zużycia baterii i pasma, a także do przekroczenia limitu pobierania danych, ponieważ pobierane są dane, których nie używasz. Musisz też zadbać o to, aby pobieranie w poprzedniości nie opóźniało uruchamiania aplikacji, gdy ta czeka na zakończenie pobierania w poprzedniości. 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 w ramach wstępnego pobierania 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% szansu na wykorzystanie w bieżącej sesji użytkownika, możesz zwykle pobrać dane w ramach 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 oznacza, że w ramach pobierania wstępnie pobierane są tylko dane wideo, które prawdopodobnie zostaną wyświetlone w ciągu kilku minut.

Jednym z rozwiązań jest zaplanowanie pełnego pobierania tylko po połączeniu z Wi-Fi i być może tylko wtedy, gdy urządzenie 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ą funkcji 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 basenem

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 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 efektywne zarządzanie.