Na tej stronie opisano, jak Android wybiera między dostępnymi jednocześnie sieciami. Ten mechanizm wyboru sieci wpływa na sposób obsługi żądań sieciowych aplikacji i systemu Androida oraz 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 Android używa klasy NetworkScore
, aby wybierać dostępne sieci. Ta klasa zawiera wiele flag, które są wymagane do podejmowania decyzji dotyczących zasad. Każda flaga semantycznie reprezentuje atrybut sieci, który jest ważny dla jej wyboru.
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łącznikiem w Ustawieniach, który pozwala użytkownikowi wybrać, której karty SIM ma być używana domyślnie. W ramach danego transportu Android preferuje sieć z flagą POLICY_TRANSPORT_PRIMARY
niż sieć bez flagi.
Agent sieci używa flagi POLICY_EXITING
do identyfikowania sieci, która wkrótce zostanie odłączona. Typowym przykładem jest sytuacja, gdy jakość sieci Wi-Fi pogarsza się, 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ślić, kiedy sieć ulega pogorszeniu na tyle, że można ją uznać za wychodzącą.
Klasa NetworkScore
umożliwia też agentowi sieci zadeklarowanie, że sieć ma być utrzymywana za pomocą flagi KEEP_CONNECTED_FOR_HANDOVER
i metody NetworkScore.Builder.setKeepConnectedReason
. Ta flaga KEEP_CONNECTED_FOR_HANDOVER
jest przydatna w przypadku potencjalnych sieci, ponieważ pozwala agentowi sieci uruchomić sieć na dodatkowym STA Wi-Fi bez czynienia jej siecią główną, dopóki nie zostanie oceniona jej wydajność. Jeśli agent sieci nie zadeklaruje tego 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, system wybiera jedną z nich, a potem ta sieć jest preferowana do momentu zmiany flagi zasad.
Implementacja funkcji wyboru sieci znajduje się w module Connectivity w AOSP. Logika zasad 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, ale muszą zamiast tego używać flag w NetworkScore
, aby przekazywać wymagane informacje o sieciach.
Android 11
Na urządzeniach z Androidem 11 lub starszym system Android wybiera sieć na podstawie prostej liczby całkowitej wysłanej z implementacji agenta sieci (NetworkAgent
). W przypadku każdego żądania system Android wybiera sieć o najwyższym wyniku liczbowym, która może spełnić to żądanie. 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 elementy sieci synchronizują się ze sobą, aby podejmować decyzje dotyczące zasad.
Jeśli 2 sieci mogą obsłużyć dane żądanie i mają tę samą liczbową ocenę, działanie jest nieokreślone.
Klasa NetworkScore
Centralna klasa funkcji wyboru sieci to NetworkScore
.
Ta klasa zawiera interfejs API i dokumentację dostępnych flag oraz metodę setKeepConnectedReason
.
Klasa NetworkScore
musi być utworzona za pomocą klasy konstruktora i przekazana do konstruktora NetworkAgent
podczas inicjalizacji. 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
: używa wyniku sieci do komunikowania zasad dotyczących sieci Wi-Fi. Ta implementacja obejmuje zgodność wsteczną ze starszymi typami liczb całkowitych w przypadku wyniku sieci za pomocą flagiPOLICY_EXITING
.
urządzenia, które są aktualizowane do Androida 12;
Producenci urządzeń, którzy aktualizują swoje urządzenia do Androida 12, muszą zmodyfikować implementacje agenta sieci, aby używać klasy NetworkScore
. Stara liczba całkowita używana w Androidzie 11 lub starszym 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ą określać żądane zmiany za pomocą flag NetworkScore
. Następnie moduł Connectivity Mainline używa flag do podjęcia decyzji o wyborze sieci. Producenci urządzeń, którzy używają kodu przeznaczonego na Androida 11 lub starszego, ale kompilują na podstawie implementacji w Androidzie 12, mogą napotkać błędy kompilacji, ponieważ metody aktualizacji starszego typu całkowitego zostały usunięte w Androidzie 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 najlepszy wynik sieci, jaką może utworzyć fabryka. Dzieje się tak, ponieważ w Androidzie 12 klasa NetworkFactory
przekazuje tylko żądania, które pasują do filtrów wyników zadeklarowanych w NetworkFactory
, a nie wszystkie żądania jak w Androidzie 11 i starszych.
Zalecamy przekazanie filtra w celu ułatwienia implementacji i oszczędzania baterii, aby nie wszystkie żądania były przekazywane do NetworkFactory
. Jeśli jednak Twoja niestandardowa implementacja wymaga, aby wszystkie żądania były przekazywane do NetworkFactory
, możesz zarejestrować NetworkFactory.registerIgnoringScore
zamiast zwykłej metody NetworkFactory.register
. Jeśli używasz tej metody, zalecamy przekazanie filtra wyniku, który najdokładniej odzwierciedla najlepszy wynik, jaki może uzyskać fabryka, aby oszczędzać baterię dzięki nieprzetwarzaniu żądań, których fabryka nie może spełnić.
Weryfikacja
Aby sprawdzić zachowanie wyboru sieci na urządzeniu z Androidem, wykonaj te testy:
NetworkScoreTest
Test CTSNetworkRanker
test jednostkowy
Nieprawidłowa implementacja może spowodować, że aplikacje będą otrzymywać nieoczekiwane sieci w odpowiedzi na żądanie NetworkCallback
, w tym domyślną sieć urządzenia (sieci, które system wysyła do aplikacji, gdy te korzystają z połączenia zwrotnego sieci z ConnectivityManager.registerDefaultNetworkCallback
).
Innym możliwym problemem związanym z nieprawidłowym wdrożeniem jest znaczne zużycie baterii spowodowane tym, że agent sieci jest wywoływany z wynikiem, który nie pozwala mu kwalifikować się do żadnego żądania, a następnie jest natychmiast wyłączany. Jeśli agent jest wielokrotnie uruchamiany i zatrzymywany, może to zużywać dużo energii.