Wybór sieci

Na tej stronie opisano, w jaki sposób system Android wybiera pomiędzy jednocześnie dostępnymi sieciami. Ten mechanizm wyboru sieci wpływa na sposób, w jaki Android realizuje żądania sieciowe aplikacji i systemu, a także na sposób wybierania sieci domyślnej dla aplikacji.

Zachowanie przy wyborze sieci

W tej sekcji opisano zachowanie wyboru sieci w przypadku urządzeń z systemem Android 12 lub nowszym oraz urządzeń z systemem Android 11 i starszym.

Androida 12

W przypadku urządzeń z systemem Android 12 lub nowszym system Android używa klasy NetworkScore do wybierania dostępnych sieci. Ta klasa zawiera wiele flag wymaganych do podejmowania decyzji politycznych. Każda flaga semantycznie reprezentuje atrybut sieci ważny przy wyborze sieci.

Agent sieciowy ( NetworkAgent ) używa flagi POLICY_TRANSPORT_PRIMARY do określenia, że ​​sieć jest preferowana, gdy występuje wiele sieci tego samego transportu. Typowym przykładem jest urządzenie z dwiema kartami SIM z przełącznikiem w Ustawieniach, który pozwala użytkownikowi wybrać, której karty SIM używać domyślnie. W ramach danego transportu Android preferuje sieć z flagą POLICY_TRANSPORT_PRIMARY od sieci bez flagi.

Agent sieciowy używa flagi POLICY_EXITING do identyfikacji sieci, która ma wkrótce zostać rozłączona. Typowym tego przykładem jest pogorszenie jakości sieci Wi-Fi, gdy użytkownik wyjdzie poza zasięg sieci. Android unika korzystania z sieci z tą flagą, jeśli dostępna jest inna sieć bez tej flagi. Każdy indywidualny agent sieciowy może określić, kiedy działanie sieci ulega degradacji na tyle, że można ją uznać za zakończoną.

Klasa NetworkScore umożliwia także agentowi sieciowemu zadeklarowanie, że sieć będzie utrzymywana przy użyciu flagi KEEP_CONNECTED_FOR_HANDOVER i metody NetworkScore.Builder.setKeepConnectedReason . Ta flaga KEEP_CONNECTED_FOR_HANDOVER jest przydatna w przypadku potencjalnych sieci, umożliwiając agentowi sieciowemu wywołanie sieci na dodatkowej stacji Wi-Fi STA bez ustawiania jej jako sieci podstawowej do czasu oceny wydajności sieci. Jeśli agent sieciowy nie zadeklaruje tej flagi, potencjalne sieci zostaną zamknięte z powodu nieobsługiwania żadnego żądania, zanim agent będzie miał szansę ocenić wydajność sieci.

Jeśli dwie sieci mogą obsłużyć dane żądanie i są równoważne z punktu widzenia zasad, wybór preferuje sieć, która aktualnie obsługuje żądanie. Jeśli żadna sieć nie obsługuje żądania, wybiera jedną z dwóch, po czym ta sieć pozostaje preferowana do czasu zmiany flag zasad.

Implementacja funkcji wyboru sieci znajduje się w module Connectivity w AOSP. Logikę polityki wyboru sieci można znaleźć w klasie NetworkRanker i jej klasach pomocniczych. Oznacza to, że producenci urządzeń nie mogą bezpośrednio dostosowywać kodu wyboru sieci, lecz zamiast tego muszą używać flag w NetworkScore w celu przekazywania wymaganych informacji o sieciach.

Androida 11

W przypadku urządzeń z systemem Android 11 lub starszym Android dokonuje wyboru sieci na podstawie prostej liczby całkowitej wysyłanej z implementacji agenta sieciowego ( NetworkAgent ). Dla każdego żądania Android wybiera sieć z najwyższym wynikiem liczbowym, która może spełnić żądanie. Ten wynik liczbowy składa się z liczby całkowitej przesłanej przez agenta sieciowego oraz dodatkowych premii lub kar przyznawanych na podstawie szeregu warunków, takich jak to, czy sieć została sprawdzona lub czy jest to sieć VPN. Poszczególni agenci sieciowi synchronizują się ze sobą w celu podejmowania decyzji politycznych.

Jeśli dwie sieci mogą obsłużyć dane żądanie i mają ten 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 metody setKeepConnectedReason .

Klasa NetworkScore musi zostać zbudowana poprzez klasę 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 sieciowego

AOSP zawiera przykładowe implementacje różnych agentów sieciowych. Poniżej znajdują się przykładowe wdrożenia:

  • TelephonyNetworkAgent : wykorzystuje wynik sieci do komunikowania zasad dotyczących sieci komórkowych
  • ClientModeImpl.WifiNetworkAgent : wykorzystuje wynik sieci do komunikowania zasad dotyczących sieci Wi-Fi. Ta implementacja obejmuje wsteczną zgodność ze starszą liczbą całkowitą dla wyniku sieci przy użyciu flagi POLICY_EXITING .

Aktualizacja urządzeń do Androida 12

Producenci urządzeń aktualizujących swoje urządzenia do systemu Android 12 muszą zmodyfikować implementacje agentów sieciowych, aby korzystały z klasy NetworkScore . Starsza liczba całkowita używana w systemie Android 11 lub starszym jest przekazywana do NetworkScore , ale w systemie Android 12 jest używana tylko do celów rejestrowania i nieregresji. W systemie Android 12 producenci urządzeń muszą wyrazić pożądane zmiany za pomocą flag NetworkScore . Następnie moduł Connectivity Mainline wykorzystuje te flagi do podjęcia decyzji o wyborze sieci. Producenci urządzeń korzystających z kodu dla systemu Android 11 lub starszego, ale budujących rozwiązania w oparciu o implementację w systemie Android 12, mogą spodziewać się błędów kompilacji, ponieważ w systemie Android 12 usunięto metody aktualizowania starszych liczb całkowitych.

W przypadku agentów sieciowych korzystających z wewnętrznej klasy NetworkFactory muszą oni wyrazić swój filtr punktacji w obiekcie NetworkScore reprezentującym najwyższy wynik sieci, jaką może utworzyć fabryka. Dzieje się tak, ponieważ w systemie Android 12 klasa NetworkFactory przekazuje tylko żądania pasujące do filtrów wyników zadeklarowanych w NetworkFactory , a nie wszystkie żądania w systemie Android 11 i starszych wersjach.

Zalecamy przekazanie filtra w celu łatwiejszej implementacji i oszczędzania baterii, aby nie wszystkie żądania były przekazywane do NetworkFactory . Jeśli jednak niestandardowa implementacja wymaga przekazywania wszystkich żądań do NetworkFactory , możesz zarejestrować NetworkFactory.registerIgnoringScore zamiast zwykłej metody NetworkFactory.register . W przypadku korzystania z tej metody zalecamy przekazanie filtra wyników, który najdokładniej odzwierciedla najlepszy wynik, jaki fabryka może uzyskać, aby oszczędzać baterię poprzez nie ocenianie żądań, których fabryka nie może spełnić.

Walidacja

Aby sprawdzić zachowanie wyboru sieci na urządzeniu z systemem Android, wykonaj następujące testy:

Nieprawidłowa implementacja może spowodować zwrócenie nieoczekiwanych sieci do aplikacji w odpowiedzi na użycie przez nie NetworkCallback , w tym wybranie sieci domyślnej urządzenia (sieć, którą system wysyła do aplikacji, gdy korzysta ona z sieciowego wywołania zwrotnego za pomocą ConnectivityManager.registerDefaultNetworkCallback ).

Innym możliwym problemem związanym z nieprawidłową implementacją jest poważne zużycie baterii spowodowane przez wyświetlenie agenta sieciowego z oceną niekwalifikującą się do żadnego żądania i natychmiastowe jego zniszczenie. Jeśli środek jest wielokrotnie podnoszony i rozkładany, może to spowodować duże zużycie baterii.