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 aktywnością sieciową, musisz wiedzieć, jak model łączności wpłynie na sprzęt radiowy.

W tej sekcji przedstawiamy automat stanów radia bezprzewodowego i wyjaśniamy, jak model łączności aplikacji wchodzi z nim w interakcję. Następnie proponuje kilka technik, które pomogą zminimalizować wpływ zużycia danych przez aplikację na baterię.

Automat stanów radia

Radio bezprzewodowe w urządzeniu użytkownika ma wbudowane funkcje oszczędzania energii, które pomagają zminimalizować zużycie baterii. Gdy radio bezprzewodowe jest w pełni aktywne, zużywa dużo energii, ale gdy jest nieaktywne lub w trybie gotowości, zużywa jej bardzo mało.

Pamiętaj, że radio nie może natychmiast przejść ze stanu gotowości do pełnej aktywności. Z „włączaniem” radia wiąże się okres oczekiwania. Dlatego bateria powoli przechodzi ze stanów o wyższej energii do stanów o niższej energii, aby oszczędzać energię, gdy nie jest używana, a jednocześnie minimalizować opóźnienia związane z „włączaniem” radia.

Automat stanów typowego radia sieci 3G składa się z 3 stanów energetycznych:

  • Pełna moc: używana, gdy połączenie jest aktywne, co umożliwia urządzeniu przesyłanie danych z największą możliwą szybkością.
  • Niski pobór mocy: stan pośredni, w którym zużycie baterii jest zmniejszone o około 50%.
  • Tryb gotowości: stan minimalnego zużycia energii, w którym nie jest aktywne żadne połączenie sieciowe.

Stany niskiego zużycia energii i gotowości zużywają znacznie mniej baterii, ale wprowadzają też znaczne opóźnienia w przypadku żądań sieciowych. Powrót do pełnej mocy z trybu niskiego poboru energii zajmuje około 1,5 sekundy, a przejście ze stanu gotowości do pełnej mocy może potrwać ponad 2 sekundy.

Aby zminimalizować opóźnienie, automat stanowy używa opóźnienia do odroczenia przejścia do stanów o niższym zużyciu energii. Na rysunku 1 przedstawiono czasy AT&T dla typowego radia 3G.


Rysunek 1. Typowy automat stanów radia bezprzewodowego 3G.

Automat stanów radiowych na każdym urządzeniu, a w szczególności powiązane z nim opóźnienie przejścia („czas ogona”) i opóźnienie uruchomienia, różnią się w zależności od zastosowanej technologii radiowej (3G, LTE, 5G itp.) i są definiowane oraz konfigurowane przez sieć operatora, w której urządzenie działa.

Na tej stronie opisujemy reprezentatywny automat stanów dla typowego radia bezprzewodowego 3G na podstawie danych dostarczonych przez AT&T. Ogólne zasady i wynikające z nich sprawdzone metody mają jednak zastosowanie do wszystkich implementacji radia bezprzewodowego.

To podejście jest szczególnie skuteczne w przypadku typowego przeglądania internetu na urządzeniach mobilnych, ponieważ zapobiega niepożądanym opóźnieniom podczas przeglądania stron. Stosunkowo krótki czas oczekiwania na zakończenie transmisji zapewnia 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 powstawania nieefektywnych aplikacji na nowoczesnych smartfonach z systemem operacyjnym Android, gdzie aplikacje działają zarówno na pierwszym planie (gdzie ważna jest latencja), jak i w tle (gdzie priorytetem powinien być czas pracy na baterii).

Wpływ aplikacji na automat stanów radia

Za każdym razem, gdy tworzysz nowe połączenie sieciowe, radio przechodzi w stan pełnej mocy. W przypadku typowego automatu stanów radia 3G opisanego wcześniej pozostanie on w stanie pełnej mocy przez cały czas przesyłania danych – plus dodatkowe 5 sekund czasu wygaszania – 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 pobieranie energii przez radio przez co najmniej 18 sekund.

W praktyce oznacza to, że aplikacja, która przesyła dane przez sekundę 3 razy na minutę, będzie utrzymywać radio bezprzewodowe w stanie ciągłej aktywności, przywracając je do trybu wysokiej mocy tuż przed przejściem w tryb gotowości.


Rysunek 2. Względne zużycie energii przez radio bezprzewodowe podczas jednosekundowego przesyłania danych, które odbywa się 3 razy na minutę. Dane nie uwzględniają opóźnienia „włączenia” między biegami.

Dla porównania, jeśli ta sama aplikacja połączyłaby transfery danych, wykonując co minutę jeden 3-sekundowy transfer, radio pozostawałoby w stanie wysokiego poboru mocy przez łącznie 20 sekund w ciągu minuty. Dzięki temu radio będzie w trybie gotowości przez 40 sekund każdej minuty, co znacznie zmniejszy zużycie baterii.


Rysunek 3. Względne zużycie 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 żywotność baterii, porozmawiajmy o kilku rzeczach, które możesz zrobić, aby zmniejszyć zużycie baterii, a jednocześnie zapewnić szybkie i płynne działanie urządzenia.

Grupowanie transferów danych

Jak wspomnieliśmy w poprzedniej sekcji, grupowanie transferów danych w taki sposób, 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 otrzymywać lub wysyłać dane w odpowiedzi na działanie użytkownika. Możesz temu zapobiec, przewidując i wstępnie pobierając dane. Inne scenariusze, takie jak wysyłanie dzienników lub danych analitycznych na serwer oraz inne niepilne transfery danych inicjowane przez aplikację, bardzo dobrze nadają się do przetwarzania wsadowego i grupowania. Wskazówki dotyczące planowania transferów sieciowych w tle znajdziesz w artykule Optymalizacja zadań inicjowanych przez aplikację.

Pobieranie danych z wyprzedzeniem

Pobieranie wstępne danych to kolejny skuteczny sposób na zmniejszenie liczby niezależnych sesji przesyłania danych uruchamianych przez aplikację. W przypadku wstępnego pobierania, gdy użytkownik wykona działanie w aplikacji, aplikacja przewiduje, które dane będą najprawdopodobniej potrzebne w przypadku kolejnych działań użytkownika, i pobiera te dane w jednym pakiecie, za pomocą jednego połączenia, z pełną przepustowością.

Przenosząc dane z wyprzedzeniem, zmniejszasz liczbę aktywacji radia wymaganych do pobrania danych. Dzięki temu nie tylko oszczędzasz baterię, ale też zmniejszasz opóźnienia, obniżasz wymagania dotyczące przepustowości i skracasz czas pobierania.

Wstępne pobieranie poprawia też wygodę 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ć zużycie pasma, pobierając nagłówki tylko po wybraniu kategorii, pełne artykuły tylko wtedy, gdy użytkownik chce je przeczytać, a miniatury tylko wtedy, gdy pojawią się na ekranie.

Dzięki temu radio pozostaje aktywne przez większość sesji czytania wiadomości przez użytkowników, gdy przewijają nagłówki, zmieniają kategorie i czytają artykuły. Nie tylko to, ciągłe przełączanie się między stanami energetycznymi powoduje znaczne opóźnienia podczas przełączania kategorii lub czytania artykułów.

Lepszym rozwiązaniem jest wstępne pobranie 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 kontynuując pobieranie pozostałych nagłówków i miniatur, a także tekstu artykułów dostępnych co najmniej na głównej liście nagłówków.

Inną alternatywą jest wstępne pobieranie wszystkich nagłówków, miniatur, tekstów artykułów i prawdopodobnie nawet pełnych zdjęć artykułów – zwykle w tle zgodnie z ustalonym harmonogramem. Takie podejście wiąże się z ryzykiem zużycia dużej ilości przepustowości i baterii na pobieranie treści, które nigdy nie zostaną użyte, dlatego należy je wdrażać ostrożnie.

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

Wstępne pobieranie danych ma wiele zalet, ale jeśli jest zbyt agresywne, może zwiększać zużycie baterii i przepustowości, a także limit pobierania, ponieważ pobiera dane, które nie są używane. Ważne jest też, aby wstępne pobieranie nie opóźniało uruchamiania aplikacji, gdy czeka ona na zakończenie wstępnego pobierania. W praktyce może to oznaczać progresywne przetwarzanie danych lub inicjowanie kolejnych transferów z nadawaniem priorytetów w taki sposób, aby najpierw pobierać i przetwarzać dane wymagane do uruchomienia aplikacji.

Intensywność wstępnego pobierania danych zależy od rozmiaru pobieranych danych i prawdopodobieństwa ich użycia. Ogólnie rzecz biorąc, na podstawie opisanego wcześniej automatu stanowego w przypadku danych, które mają 50% szans na użycie w bieżącej sesji użytkownika, możesz wstępnie pobierać dane przez około 6 sekund (około 1–2 MB), 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, warto wstępnie pobierać dane w taki sposób, aby konieczne było zainicjowanie kolejnego pobierania co 2–5 minut, a wielkość pobieranych danych wynosiła od 1 do 5 MB.

Zgodnie z tą zasadą duże pliki do pobrania, takie jak pliki wideo, powinny być pobierane w częściach w regularnych odstępach czasu (co 2–5 minut), co oznacza, że wstępnie pobierane są tylko dane wideo, które prawdopodobnie będą oglądane 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 także wtedy, gdy się ładuje. Interfejs WorkManager API obsługuje dokładnie ten przypadek użycia, umożliwiając ograniczenie pracy w tle do momentu, w którym urządzenie spełni kryteria określone przez dewelopera, takie jak ładowanie i połączenie z Wi-Fi.

Sprawdzanie łączności przed wysł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 połączenia i pomiaru połączenia. Jeśli nie ma sieci, aplikacja może oszczędzać baterię, nie zmuszając radia komórkowego do wyszukiwania. Żądanie można zaplanować i wykonać w pakiecie z innymi żądaniami po nawiązaniu połączenia.

Połączenia puli

Dodatkową strategią, która może pomóc oprócz przetwarzania wsadowego i wstępnego pobierania, jest pulowanie połączeń sieciowych aplikacji.

Ponowne wykorzystywanie istniejących połączeń sieciowych jest zwykle bardziej wydajne niż inicjowanie nowych. Ponowne wykorzystywanie połączeń umożliwia też sieci inteligentniejsze reagowanie na przeciążenia i powiązane z nimi problemy z danymi sieciowymi.

HttpURLConnection i większość klientów HTTP, np. OkHttp, domyślnie włączają pulę połączeń i ponownie wykorzystują to samo połączenie w przypadku wielu żądań.

Podsumowanie i perspektywy

W tej sekcji dowiedzieliśmy się wiele o radiu bezprzewodowym i o strategiach, które można stosować w celu zapewnienia szybkiej i wygodnej obsługi przy jednoczesnym zmniejszeniu zużycia baterii.

W następnej sekcji przyjrzymy się szczegółowo 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 do skutecznego zarządzania tymi interakcjami.