Optymalizacja dostępu do sieci

Przesyłanie danych za pomocą bezprzewodowego nadajnika radiowego jest potencjalnie jednym z najważniejszych źródeł zużycia baterii w aplikacji. Aby zminimalizować zużycie baterii związane z aktywnością w sieci, musisz wiedzieć, jak Twój model połączenia wpłynie na sprzęt radiowy.

W tej sekcji przedstawiamy bezprzewodowe urządzenie radiowe i objaśniamy, jak model połączenia aplikacji z nim wchodzi w interakcję. Udostępnia ona kilka technik, które pomagają zminimalizować wpływ zużycia danych przez aplikację na baterię.

Maszyna stanu radiowego

Radio bezprzewodowe na urządzeniu użytkownika ma wbudowane funkcje oszczędzania energii, które pomagają zminimalizować zużycie energii. W pełni aktywne radio bezprzewodowe zużywa dużo energii, ale gdy jest nieaktywne lub znajduje się w trybie czuwania, zużywa bardzo mało energii.

Pamiętaj, że radio nie może od razu przejść z trybu gotowości do w pełni aktywnej. Występuje pewien czas oczekiwania związany z „włączeniem” radia. W związku z tym bateria przechodzi ze stanów o większej energii w niższe, aby oszczędzać energię, gdy jej nie używasz, jednocześnie starając się zminimalizować opóźnienia związane z włączaniem radia.

Maszyna stanowa typowej sieci 3G składa się z 3 stanów energii:

  • Pełna moc: używana, gdy połączenie jest aktywne, co umożliwia urządzeniu przesyłanie danych z maksymalną szybkością.
  • Niski poziom energii: stan pośredni, który zmniejsza zużycie energii o około 50%.
  • Stan czuwania: minimalny zużycie energii, w którym nie jest aktywne połączenie sieciowe.

Stany niskiego zużycia baterii i czuwania znacznie zużywają baterię, ale powodują też znaczne opóźnienia w obsłudze żądań sieciowych. Powrót do pełnego zasilania z niskiego stanu trwa około 1,5 sekundy, a przejście z trybu czuwania do pełnego naładowania może zająć ponad 2 sekundy.

Aby zminimalizować czas oczekiwania, maszyna stanu używa opóźnienia, aby opóźnić przejście na stany o niższym zużyciu energii. Na Rysunku 1 przedstawiono kody czasowe AT&T w przypadku typowego radia 3G.


Rysunek 1. Typowy bezprzewodowy odbiornik radiowy 3G.

Mechanizm radiowy na każdym urządzeniu, a zwłaszcza związane z nim opóźnienie przejścia („opóźnienie przejścia”) i opóźnienie na uruchomienie, zależy od stosowanej technologii bezprzewodowej (3G, LTE, 5G itd.) i jest definiowana i konfigurowana przez sieć operatora, w której działa urządzenie.

Na tej stronie opisujemy reprezentatywną maszynę stanową typowego radia bezprzewodowego 3G, korzystając z danych dostarczanych przez AT&T. Ogólne zasady i wynikające z nich sprawdzone metody mają jednak zastosowanie do wszystkich wdrożeń bezprzewodowych.

Ta metoda jest szczególnie skuteczna w przypadku typowego przeglądania internetu za pomocą urządzeń mobilnych, ponieważ zapobiega niepożądanym opóźnieniom podczas przeglądania internetu. Względnie krótki czas oczekiwania sprawia też, że po zakończeniu sesji przeglądania radio może przejść w niższy poziom energii.

Takie podejście może niestety prowadzić do powstawania nieefektywnych aplikacji w nowoczesnych systemach operacyjnych na smartfonach, takich jak Android, gdzie aplikacje działają zarówno na pierwszym planie (gdy opóźnienie jest ważne), jak i w tle (główne powinno być zużycie baterii).

Jak aplikacje wpływają na system radiowy

Za każdym razem, gdy tworzysz nowe połączenie sieciowe, radio przełącza się w pełne zasilanie. W przypadku opisanej wcześniej typowej stacji radiowej 3G pozostanie ona w pełni naładowana przez cały czas transferu (plus dodatkowe 5 sekund czasu reakcji), a następnie 12 sekund w stanie niskiej energii. Dlatego na typowym urządzeniu 3G każda sesja przesyłania danych powoduje pobieranie energii przez radio przez co najmniej 18 sekund.

W praktyce oznacza to, że aplikacja, która przesyła dane przez 1 sekundę, czyli 3 razy na minutę, będzie stale działać, przenosząc urządzenie z powrotem do wysokiego zasilania w momencie przejścia w tryb gotowości.


Rysunek 2. Względne zużycie bezprzewodowej energii radiowej przy jednosekundowym przesyłaniu danych 3 razy na minutę. Ilustracja nie uwzględnia czasu oczekiwania na włączenie zasilania między uruchomieniami.

Dla porównania, jeśli ta sama aplikacja łączy przesyłanie danych, wykonując pojedynczy transfer 3-sekundowy co minutę, utrzymywałoby się ono w trybie wysokiego mocy przez łącznie tylko 20 sekund na minutę. Pozwoli to na pozostawienie radia w trybie gotowości przez 40 sekund w każdej minucie, co znacznie zmniejszy zużycie baterii.


Rysunek 3. Względne zużycie energii bezprzewodowej w przypadku trzysekundowych transferów danych wykonywanych co minutę.

Techniki optymalizacji

Wiesz już, jak dostęp do sieci wpływa na żywotność baterii. Przyjrzyjmy się teraz tym, co można zrobić, aby zmniejszyć zużycie baterii, a jednocześnie zapewnić jej szybkie i płynne działanie.

Przenoszenie danych w pakiecie

Jak wspomnieliśmy w poprzedniej sekcji, jednym z najlepszych sposobów na zwiększenie wydajności baterii jest łączenie przesyłania danych w taki sposób, aby rzadziej przesyłać dane.

Oczywiście nie zawsze jest to możliwe, jeśli aplikacja musi odbierać lub wysyłać dane natychmiast w odpowiedzi na działanie użytkownika. Aby temu zaradzić, możesz przewidywać i pobierać dane z wyprzedzeniem. Inne scenariusze, takie jak wysyłanie logów lub analiz na serwer i inne, niepilne przesyłanie danych inicjowanych przez aplikację, bardzo dobrze się sprawdzają w grupowaniu i grupowaniu. Wskazówki dotyczące planowania transferów sieci w tle znajdziesz w artykule o optymalizowaniu zadań inicjowanych przez aplikację.

Pobierz z wyprzedzeniem

Pobieranie danych z wyprzedzeniem to kolejny skuteczny sposób na zmniejszenie liczby niezależnych sesji przenoszenia danych uruchamianych przez aplikację. W przypadku pobierania z wyprzedzeniem, gdy użytkownik wykonuje działanie w aplikacji, aplikacja przewiduje, które dane najprawdopodobniej będą potrzebne w kolejnej serii działań użytkownika, i pobiera je w ramach jednej serii, przez pojedyncze połączenie, z pełną wydajnością.

Wyprzedzenie transferów pozwala ograniczyć liczbę aktywacji radiowych niezbędnych do pobrania danych. W efekcie nie tylko oszczędzasz baterię, ale też skraca czas oczekiwania, zmniejsza wymaganą przepustowość i skraca czas pobierania.

Pobieranie z wyprzedzeniem usprawnia też korzystanie z aplikacji przez zminimalizowanie opóźnień w aplikacji spowodowanych 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 stara się zmniejszyć przepustowość, pobierając nagłówki tylko po wybraniu kategorii, pełne artykuły tylko wtedy, gdy chce je przeczytać użytkownik, oraz miniatury w momencie, gdy użytkownik przewija stronę.

Przy takim podejściu radio musi pozostać aktywne przez większość użytkowników, którzy czytają wiadomości, gdy 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 podejściem jest pobieranie z wyprzedzeniem rozsądnej ilości danych na początku, zaczynając od pierwszego zestawu nagłówków i miniatur wiadomości, aby skrócić czas oczekiwania, oraz do kontynuowania pozostałych nagłówków i miniatur, a także do tekstu każdego artykułu dostępnego przynajmniej z głównej listy nagłówków.

Inną alternatywą jest pobieranie z wyprzedzeniem wszystkich nagłówków, miniatur, tekstu artykułu, a czasem nawet całych zdjęć artykułu – zwykle w tle, zgodnie z ustalonym harmonogramem. Takie podejście wiąże się z ryzykiem wykorzystania znacznej przepustowości i zużywania baterii bądź nadmiernie baterii podczas pobierania treści, które nie są nigdy używane, dlatego należy stosować ją z rozwagą.

Dodatkowe uwagi

Pobieranie danych z wyprzedzeniem ma wiele zalet, ale zbyt agresywne pobieranie wiąże się również z ryzykiem zwiększenia zużycia baterii i przepustowości (a także limitu pobierania) z powodu pobierania nieużywanych danych. Ważne jest też, aby pobieranie z wyprzedzeniem nie opóźniało uruchomienia aplikacji, gdy oczekuje ona na zakończenie tego procesu. W praktyce może to oznaczać stopniowe przetwarzanie danych lub inicjowanie kolejnych transferów tak, aby dane wymagane do uruchomienia aplikacji były najpierw pobierane i przetwarzane.

Szybkość pobierania z wyprzedzeniem danych zależy od rozmiaru pobieranych danych i prawdopodobieństwa ich wykorzystania. W przybliżeniu, biorąc pod uwagę opisaną wcześniej maszynę stanu, w przypadku danych, które mają 50% szans na wykorzystanie w bieżącej sesji użytkownika, można na początku pobrać z wyprzedzeniem około 6 sekund (około 1–2 MB), zanim potencjalny koszt pobrania nieużywanych danych będzie równy potencjalnej oszczędności wynikającej z ich niepobierania.

Ogólnie dobrze jest pobierać dane z wyprzedzeniem, aby kolejne pobieranie było konieczne tylko co 2–5 minut i w kolejności od 1 do 5 megabajtów.

Zgodnie z tą zasadą duże pliki do pobrania, np. filmy, należy pobierać w regularnych odstępach czasu (co 2–5 minut). Oznacza to, że w ten sposób pobierane są z wyprzedzeniem tylko te filmy, które mogą zostać wyświetlone w ciągu kilku najbliższych minut.

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

Sprawdzaj połączenie przed wysłaniem żądań

Szukanie sygnału sieci komórkowej to jedna z czynności, które często powodują zużycie energii na urządzeniach mobilnych. Sprawdzoną metodą w przypadku żądań zainicjowanych przez użytkownika jest sprawdzenie najpierw połączenia przy użyciu ConnectivityManager. Jak pokazano w artykule Monitorowanie stanu i pomiaru połączeń. Jeśli brak sieci, aplikacja może oszczędzać baterię, nie wymuszając wyszukiwania przez radio komórkowe. Po nawiązaniu połączenia to żądanie można zaplanować i wykonać w grupie z innymi żądaniami.

Połączenia w puli

Dodatkową strategią, która może pomóc oprócz grupowania i pobierania z wyprzedzeniem, jest łączenie połączeń sieciowych aplikacji.

Lepiej jest ponownie wykorzystać istniejące połączenia sieciowe niż zainicjować nowe. Ponowne wykorzystywanie połączeń umożliwia też sieci bardziej inteligentnie reagowanie na zatory i powiązane problemy z danymi sieciowymi.

HttpURLConnection i większość klientów HTTP, takich jak OkHttp, domyślnie włącza pulę połączeń i w wielu żądaniach używa tego samego połączenia.

Podsumowanie i perspektywa

W tej sekcji pokazaliśmy sporo informacji o bezprzewodowym radiu, a także o strategiach, które możesz zastosować w szerokim zakresie, aby zapewnić użytkownikom szybkie, responsywne działanie i zmniejszyć zużycie baterii.

W następnej sekcji przyjrzymy się 3 różnym typom interakcji sieciowych, które są typowe dla większości aplikacji. Poznasz czynniki wpływające na każdy z tych typów, a także nowoczesne techniki i interfejsy API umożliwiające sprawne zarządzanie interakcjami.