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 w aplikacji. 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 bezprzewodowego radia i wyjaśniamy, jak model łączności aplikacji z nią współdziała. 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ść ze stanu gotowości do w pełni aktywnego działania od razu. Czas oczekiwania jest związany z „włączaniem” radia. Akumulator przechodzi ze stanów zwiększonej energii na niższe, aby oszczędzać energię, gdy nie jest używana. Jednocześnie stara 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 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.

Niestety takie podejście może prowadzić do niewydajnych aplikacji w nowoczesnych systemach operacyjnych na smartfony, takich jak Android, gdzie aplikacje działają zarówno na pierwszym planie (gdy ważne jest opóźnienie), 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 z siecią, radio przechodzi w stan pełnej mocy. W przypadku opisanego wcześniej typowego urządzenia radiowego 3G pozostanie ono w pełni naładowane przez cały czas transferu (plus dodatkowe 5 sekund), a następnie 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ę na co najmniej 18 sekund.

W praktyce oznacza to, że aplikacja, która trzykrotnie w ciągu minuty 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 ono 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ę. Dzięki temu radio może pozostawać w trybie gotowości przez 40 sekund na minutę, co znacząco zmniejszy zużycie baterii.


Rysunek 3. Względne zużycie energii radiowej na potrzeby 3-sekundowych transferów co 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.

Przesyłanie 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 Optymalizacja zadań inicjowanych przez aplikację.

pobieranie z wyprzedzeniem,

Pobieranie danych w tle 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 podejściem 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 pozostałymi nagłówkami i miniaturami oraz tekstem artykułu dostępnym z co najmniej listy głównych 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 wymaga sporego wykorzystania przepustowości i czasu pracy na baterii, co może spowodować pobieranie treści, które nie są nigdy używane, dlatego powinna być wdrażana z rozwagą.

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. Ważne jest też, aby upewnić się, że pobieranie z wyprzedzeniem nie opóźni uruchomienia aplikacji, gdy aplikacja czeka na zakończenie pobierania z wyprzedzeniem. 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 z wyprzedzeniem zależy od ich rozmiaru i prawdopodobieństwa ich wykorzystania. 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 pobierać dane w poprzednim planie na 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, dobrze jest pobierać dane z wyprzedzeniem, by powtarzać je co 2–5 minut i od 1 do 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 poprzednim pobieraniu będą uwzględniane tylko dane 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 spełnia właśnie ten przypadek użycia i umożliwia ograniczenie działania w tle, dopóki urządzenie nie spełni kryteriów określonych przez dewelopera, takich jak ładowanie czy 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 w telefonie komórkowym. Po nawiązaniu połączenia prośbę można zaplanować i wykonać w grupie razem z innymi prośbami.

Połączenia basenu

Dodatkową strategią, która może być pomocna poza grupowaniem i pobieraniem z wyprzedzeniem, jest łączenie 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 wrażenia podczas korzystania z 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.