Na tej stronie opisano, jak Android wybiera między dostępnymi jednocześnie sieciami. Ten mechanizm wyboru sieci wpływa na sposób działania aplikacji i systemu przez Androida żądań sieciowych i wpływa na wybór domyślnej sieci dla aplikacji.
Zachowanie przy wyborze sieci
W tej sekcji opisano zachowanie wyboru sieci na urządzeniach z Androidem 12 lub nowszym oraz na urządzeniach z Androidem 11 lub starszym.
Android 12
Na urządzeniach z Androidem 12 lub nowszym
NetworkScore
i klasyfikacja, aby wybrać jedną z dostępnych sieci. Ta klasa zawiera wiele flag, które są wymagane do podejmowania decyzji dotyczących zasad. Każda flaga semantycznie reprezentuje
atrybutu sieci, który ma duże znaczenie przy wyborze sieci.
Agent sieci (NetworkAgent
) używa flagi POLICY_TRANSPORT_PRIMARY
, aby wskazać, że sieć jest preferowana, gdy występuje wiele sieci tego samego transportu. Typowym przykładem jest urządzenie dual SIM z
przełącz w Ustawieniach, aby umożliwić użytkownikowi wybór kart SIM, które mają być używane
wartość domyślną. W ramach danego transportu Android preferuje sieć z
POLICY_TRANSPORT_PRIMARY
i oznacza sieć bez tej flagi.
Agent sieci używa funkcji
POLICY_EXITING
oznacza sieć, która prawdopodobnie wkrótce się zakończy. Typowym przykładem jest pogorszenie jakości sieci Wi-Fi, gdy użytkownik oddala się od niej. Android nie używa sieci z tą flagą, jeśli jest dostępna inna sieć bez tej flagi. Każdy agent sieci może
określać, kiedy sieć ulega pogorszeniu na tyle, że jest uważane za wyjście.
Klasa NetworkScore
pozwala także agentowi sieci zadeklarować, że sieć
są przechowywane za pomocą
KEEP_CONNECTED_FOR_HANDOVER
flaga i
NetworkScore.Builder.setKeepConnectedReason
. Ten
KEEP_CONNECTED_FOR_HANDOVER
jest przydatna w przypadku potencjalnych sieci. Agent sieciowy może wygenerować
w dodatkowej sieci Wi-Fi STA, ale nie ustawiając jej jako głównej, dopóki
skuteczność sieci. Jeśli agent sieci nie zadeklaruje tej flagi, potencjalne sieci zostaną usunięte z usług, ponieważ nie obsługują żadnych żądań, zanim agent będzie mieć możliwość oceny ich działania.
Jeśli 2 sieci mogą obsłużyć dane żądanie i są równoważne pod względem zasad, wybór preferuje sieć, która obecnie obsługuje to żądanie. Jeśli żadna sieć nie obsługuje żądania, wybiera jedną z dwóch, po która będzie nadal preferowana, dopóki flagi zasad się nie zmienią.
Implementacja funkcji wyboru sieci znajduje się w sekcji
Moduł połączeń
w AOSP. Logika zasad dotycząca wyboru sieci znajduje się w klasie NetworkRanker
i jej klasach pomocniczych. Oznacza to, że producenci urządzeń nie mogą
bezpośrednio dostosowywać kod wyboru sieci, ale zamiast tego muszą używać flag
NetworkScore
do przekazywania wymaganych informacji o sieciach.
Android 11
Na urządzeniach z Androidem 11 lub starszym Android dokonuje wyboru sieci
na podstawie prostej liczby całkowitej wysłanej z implementacji agenta sieci
(NetworkAgent
).
W przypadku każdego żądania Android wybiera sieć o najwyższym wyniku liczbowym.
które spełnią Twoją prośbę. Ta liczba składa się z całości liczbowej wysłanej przez agenta sieci oraz dodatkowych bonusów lub kar przyznanych na podstawie kilku warunków, takich jak to, czy sieć jest zweryfikowana lub czy jest to sieć VPN. Poszczególne agenty sieci są synchronizowane po kolei
podejmowanie decyzji w zakresie zasad.
Jeśli dwie sieci mogą obsłużyć dane żądanie i mają taki sam wynik liczbowy, zachowanie jest niezdefiniowane.
Klasa NetworkScore
Centralną klasą funkcji wyboru sieci jest NetworkScore
.
Ta klasa zawiera interfejs API i dokumentację dostępnych flag oraz metodę setKeepConnectedReason
.
Klasa NetworkScore
musi być utworzona za pomocą klasy kreatora i musi być przekazywana
do
Konstruktor NetworkAgent
podczas inicjowania. Wyniki sieci można zaktualizować w dowolnym momencie za pomocą metody NetworkAgent#sendNetworkScore
.
Przykłady implementacji agenta sieci
AOSP zawiera przykładowe implementacje różnych agentów sieciowych. Oto przykładowe implementacje:
TelephonyNetworkAgent
: używa wyniku sieci do komunikowania zasad dotyczących sieci komórkowych.ClientModeImpl.WifiNetworkAgent
: Wykorzystuje wynik sieci do komunikowania zasad dla sieci Wi-Fi. Ta implementacja obejmuje zgodność wsteczną ze starszymi typami liczb całkowitych w przypadku oceny sieci za pomocą flagiPOLICY_EXITING
.
urządzenia, które są aktualizowane do Androida 12;
Producenci urządzeń uaktualniają swoje urządzenia do
Android 12 musi zmodyfikować agenta sieci
do użycia klasy NetworkScore
. Stara liczba całkowita używana w Androidzie 11 lub niższym jest przekazywana w argumencie NetworkScore
, ale służy tylko do rejestrowania i celów nieregressyjnych w Androidzie 12.
W Androidzie 12 producenci urządzeń muszą wyrazić
odpowiednie zmiany za pomocą flag NetworkScore
. Moduł Mainline Connectivity
Następnie wybiera tę sieć na podstawie odpowiednich flag. Urządzenia
producentów wykorzystujących kod na Androida 11 lub starszych wersji, ale tworzących
implementacja w Androidzie 12 może się spodziewać błędów kompilacji
ponieważ metody aktualizowania starszych liczb całkowitych zostały usunięte w
Android 12.
W przypadku agentów sieci, którzy korzystają z wewnętrznej klasy NetworkFactory
, filtr wyniku musi być wyrażony w obiekcie NetworkScore
, który reprezentuje najsilniejszy wynik sieci, jaką może utworzyć fabryka. To jest
bo w Androidzie 12 tylko klasa NetworkFactory
przekazuje żądania pasujące do filtrów wyników zadeklarowanych w NetworkFactory
zamiast wszystkich żądań w Androidzie 11 i starszych.
Zalecamy pominięcie filtra. Ułatwi to implementację i oszczędność baterii.
że nie wszystkie żądania są przekazywane do NetworkFactory
. Jeśli jednak Twój niestandardowy
wymaga przekazania wszystkich żądań do NetworkFactory
, możesz
rejestr
NetworkFactory.registerIgnoringScore
zamiast zwykłego
NetworkFactory.register
. Jeśli używasz tej metody, zalecamy przekazanie filtra wyniku, który najdokładniej odzwierciedla najlepszy wynik, jaki może uzyskać fabryka. Pozwoli to zaoszczędzić baterię, ponieważ nie będzie ona oceniać żądań, których fabryka nie może spełnić.
Weryfikacja
Aby sprawdzić działanie wyboru sieci na urządzeniu z Androidem, użyj następujące testy:
NetworkScoreTest
Test CTSNetworkRanker
test jednostkowy
Nieprawidłowa implementacja może spowodować zwrócenie nieoczekiwanej sieci do
aplikacji w odpowiedzi na ich użycie
NetworkCallback
,
Dotyczy to m.in. wyboru domyślnej sieci urządzenia (sieci, z której korzysta system)
które wysyła do aplikacji, gdy używa wywołania zwrotnego sieci z
ConnectivityManager.registerDefaultNetworkCallback
).
Innym możliwym problemem przy nieprawidłowej implementacji jest duże zużycie baterii jest spowodowana ustawieniem agenta sieci z wynikiem, który nie pozwala mu nie kwalifikują się do żadnego żądania i zostaną natychmiast usunięte. Jeśli agent to Wielokrotne uruchamianie i grzanie, może to wyczerpać baterię.