Na tej stronie opisujemy, jak Android wybiera spośród jednocześnie dostępnych sieci. Ten mechanizm wyboru sieci wpływa na sposób, w jaki Android realizuje żądania sieciowe aplikacji i systemu, oraz na to, jak Android wybiera domyślną sieć dla aplikacji.
Działanie funkcji wyboru sieci
W tej sekcji opisujemy działanie funkcji wyboru sieci na urządzeniach z Androidem 12 lub nowszym oraz na urządzeniach z Androidem 11 (poziom API 30) lub starszym.
Android 12
Na urządzeniach z Androidem 12 lub nowszym Android używa
klasy NetworkScore do wybierania spośród dostępnych sieci. Ta klasa zawiera flagi, które umożliwiają podejmowanie decyzji dotyczących zasad. Każda flaga reprezentuje atrybut sieci, który jest ważny przy wyborze sieci.
Agent sieci (NetworkAgent) używa flagi POLICY_TRANSPORT_PRIMARY
, aby określić, że Android preferuje sieć, jeśli dostępnych jest kilka sieci tego
samego typu. Na przykład urządzenie z 2 kartami SIM ma w Ustawieniach przełącznik, który pozwala wybrać, której karty SIM chcesz używać domyślnie. W ramach danego typu sieci Android preferuje sieć z flagą POLICY_TRANSPORT_PRIMARY od sieci bez tej flagi.
Agent sieci używa flagi POLICY_EXITING, aby zidentyfikować sieć, która
ma się rozłączyć. Na przykład jakość sieci Wi-Fi pogarsza się, gdy użytkownik wyjdzie poza jej zasięg. Android unika używania sieci z tą flagą, jeśli dostępna jest inna sieć bez niej. Każdy agent sieci może określić, kiedy jakość sieci pogorszy się na tyle, że można ją uznać za wychodzącą.
Klasa NetworkScore umożliwia też agentowi sieci zadeklarowanie, że Android utrzymuje połączenie z siecią za pomocą flagi KEEP_CONNECTED_FOR_HANDOVER i metody
NetworkScore.Builder.setKeepConnectedReason. Flaga KEEP_CONNECTED_FOR_HANDOVER pomaga potencjalnym sieciom. Ta flaga umożliwia agentowi sieci uruchomienie sieci na dodatkowym interfejsie Wi-Fi STA bez ustawiania jej jako sieci podstawowej, dopóki Android nie oceni wydajności sieci. Jeśli agent sieci nie zadeklaruje tej flagi, Android rozłączy potencjalne sieci, ponieważ nie obsługują one żadnych żądań, zanim agent oceni wydajność sieci.
Jeśli 2 sieci mogą obsługiwać dane żądanie i mają równoważne zasady, Android preferuje sieć, która obsługuje żądanie. Jeśli żadna sieć nie obsługuje żądania, Android wybiera jedną z tych 2 sieci. Ta sieć jest nadal preferowana, dopóki nie zmienią się flagi zasad.
Funkcja wyboru sieci jest zaimplementowana w module Connectivity w
ramach Projektu Android Open Source (AOSP). Logika zasad dotyczących wyboru sieci
znajduje się w klasie NetworkRanker i jej klasach pomocniczych. Oznacza to, że producenci urządzeń nie mogą bezpośrednio dostosowywać kodu wyboru sieci. Zamiast tego muszą używać flag w NetworkScore, aby przekazywać informacje o sieciach.
Android 11
Na urządzeniach z Androidem 11 lub starszym Android wybiera sieć
na podstawie liczby całkowitej wysyłanej przez agenta sieci (NetworkAgent). W przypadku każdego
żądania Android wybiera sieć z najwyższym wynikiem liczbowym, która może
obsłużyć żądanie. Ten wynik liczbowy składa się z liczby całkowitej wysyłanej przez agenta sieci oraz dodatkowych premii lub kar. Android stosuje te premie lub kary na podstawie warunków, np. czy sieć jest zweryfikowana lub czy jest to sieć VPN. Agenci sieci synchronizują się ze sobą, aby podejmować decyzje dotyczące zasad.
Jeśli 2 sieci mogą obsługiwać dane żądanie i mają ten sam wynik liczbowy, działanie jest niezdefiniowane.
Klasa NetworkScore
Klasa NetworkScore jest kluczowa dla funkcji wyboru sieci. Ta klasa zawiera interfejs API i dokumentację dostępnych flag oraz metody NetworkScore.Builder.setKeepConnectedReason.
Klasę NetworkScore musisz utworzyć za pomocą klasy budującej i przekazać ją do
konstruktora NetworkAgent podczas inicjowania. Wyniki sieci możesz aktualizować
w dowolnym momencie za pomocą NetworkAgent#sendNetworkScore
metody.
Przykłady implementacji agenta sieci
AOSP zawiera przykładowe implementacje różnych agentów sieci. Oto przykłady implementacji:
TelephonyNetworkAgent: używa wyniku sieci do przekazywania zasad dotyczących sieci komórkowych.ClientModeImpl.WifiNetworkAgent: używa wyniku sieci do przekazywania zasad dotyczących sieci Wi-Fi. Ta implementacja zapewnia zgodność wsteczną ze starszą liczbą całkowitą dla wyniku sieci dzięki użyciu flagiPOLICY_EXITING.
Urządzenia uaktualniane do Androida 12
Producenci urządzeń, którzy uaktualniają swoje urządzenia do Androida 12, muszą zmodyfikować implementacje agenta sieci, aby używać klasy NetworkScore. Starsza liczba całkowita używana w Androidzie 11 lub starszym jest przekazywana w NetworkScore, ale w Androidzie 12 jest używana tylko do logowania i zapobiegania regresji. W Androidzie 12 producenci urządzeń muszą wyrażać zmiany za pomocą flag NetworkScore. Moduł Connectivity Mainline używa następnie flag do podejmowania decyzji dotyczących wyboru sieci. Producenci urządzeń, którzy używają kodu dla Androida 11 lub starszego, ale kompilują go na podstawie implementacji w Androidzie 12, mogą spodziewać się błędów kompilacji, ponieważ metody aktualizowania starszej liczby całkowitej zostały usunięte w Androidzie 12.
W przypadku agentów sieci, którzy używają wewnętrznej NetworkFactory klasy, musisz
wyrazić filtr wyniku w obiekcie NetworkScore, który reprezentuje
najsilniejszy wynik sieci, jaką fabryka może utworzyć. Dzieje się tak, ponieważ w Androidzie 12 klasa NetworkFactory przekazuje tylko żądania, które pasują do filtrów wyniku zadeklarowanych w NetworkFactory, w przeciwieństwie do Androida 11 i starszych wersji, w których przekazuje wszystkie żądania.
Możesz przekazać filtr, aby uprościć implementację i oszczędzać baterię, co zapewni, że NetworkFactory nie będzie przetwarzać wszystkich żądań. Jeśli jednak Twoja niestandardowa
implementacja wymaga, aby wszystkie żądania były przekazywane do NetworkFactory, możesz
zarejestrować NetworkFactory.registerIgnoringScore zamiast zwykłej
NetworkFactory.register metody. Jeśli używasz tej metody, przekaż filtr wyniku, który najdokładniej reprezentuje najlepszy wynik, jaki fabryka może utworzyć.
Pozwala to oszczędzać baterię, ponieważ zapobiega ocenianiu żądań, których fabryka nie może zrealizować.
Weryfikacja
Aby sprawdzić działanie funkcji wyboru sieci na urządzeniu z Androidem, użyj tych testów:
- test CTS
NetworkScoreTest - test jednostkowy
NetworkRanker
Nieprawidłowa implementacja może spowodować, że aplikacje będą otrzymywać nieoczekiwane sieci
gdy używają NetworkCallback. Obejmuje to wybieranie domyślnej sieci urządzenia (sieci, którą system wysyła do aplikacji, gdy używa ona wywołania zwrotnego sieci, np. za pomocą
ConnectivityManager.registerDefaultNetworkCallback).
Innym możliwym problemem związanym z nieprawidłową implementacją jest szybkie zużycie baterii. Dzieje się tak, gdy agent sieci jest uruchamiany z wynikiem, który nie pozwala mu kwalifikować się do żadnego żądania, i jest natychmiast rozłączany. Jeśli agent wielokrotnie uruchamia i rozłącza sieć, może to zużywać znaczną ilość energii baterii.