Wybór sieci

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ą flagi POLICY_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:

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ę.