Wybór sieci

Na tej stronie opisujemy, jak Android wybiera spośród dostępnych jednocześnie sieci. Ten mechanizm wyboru sieci wpływa na sposób, w jaki Android realizuje żądania sieciowe aplikacji i systemu, oraz na sposób, w jaki Android wybiera domyślną sieć dla aplikacji.

Działanie wyboru sieci

W tej sekcji opisujemy zachowanie związane z wybieraniem sieci na urządzeniach z Androidem 12 lub nowszym oraz na urządzeniach z Androidem 11 (API na poziomie 30) i starszym.

Android 12

W przypadku urządzeń z Androidem 12 lub nowszym Android używa klasy NetworkScore do wybierania spośród dostępnych sieci. Ta klasa zawiera flagi, które podejmują decyzje dotyczące 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 występuje wiele sieci tego samego typu transportu. Na przykład urządzenie z 2 kartami SIM ma w Ustawieniach przełącznik, który pozwala wybrać domyślną kartę SIM. W ramach danego transportu Android preferuje sieć z flagą POLICY_TRANSPORT_PRIMARY od sieci bez tej flagi.

Agent sieci używa flagi POLICY_EXITING do identyfikowania sieci, która ma zostać odłączona. Jakość sieci Wi-Fi pogarsza się na przykład, gdy użytkownik wyjdzie poza jej zasięg. Android unika używania sieci z tym oznaczeniem, jeśli dostępna jest inna sieć bez niego. Każdy agent sieci może określić, kiedy sieć ulegnie pogorszeniu na tyle, aby można było uznać, że z niej wychodzi.

Klasa NetworkScore umożliwia też agentowi sieciowemu zadeklarowanie, że Android utrzymuje połączenie sieciowe za pomocą flagi KEEP_CONNECTED_FOR_HANDOVER i metody NetworkScore.Builder.setKeepConnectedReason. Ta flaga KEEP_CONNECTED_FOR_HANDOVER pomaga potencjalnym sieciom. Ta flaga umożliwia agentowi sieci włączenie sieci na dodatkowym urządzeniu STA Wi-Fi bez ustawiania jej jako sieci podstawowej, dopóki Android nie oceni jej wydajności. Jeśli agent sieci nie zadeklaruje tego flagi, Android zamyka potencjalne sieci, ponieważ nie obsługują one żadnych żądań, zanim agent oceni skuteczność sieci.

Jeśli 2 sieci mogą obsłużyć 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 dwóch sieci. Ta sieć pozostanie preferowana, dopóki nie zmienią się flagi zasad.

Funkcja wyboru sieci jest zaimplementowana w module łączności w ramach Projektu Android Open Source (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. Zamiast tego muszą używać flag w NetworkScore, aby przekazywać informacje o sieciach.

Android 11

W przypadku urządzeń z Androidem 11 lub starszym system Android wybiera sieć na podstawie liczby całkowitej wysłanej przez agenta sieci (NetworkAgent). W przypadku każdego żądania Android wybiera sieć o najwyższym wyniku liczbowym, która może spełnić to żądanie. Ten wynik liczbowy składa się z liczby całkowitej wysyłanej przez agenta sieci oraz dodatkowych premii lub kar. Android stosuje te bonusy lub kary w zależności od 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 metodę NetworkScore.Builder.setKeepConnectedReason.

Klasę NetworkScore musisz utworzyć za pomocą klasy narzędzia do tworzenia i przekazać ją do NetworkAgent konstruktora podczas inicjowania. Możesz w dowolnym momencie zaktualizować wyniki sieci, korzystając z metody NetworkAgent#sendNetworkScore.

Przykłady implementacji agenta sieci

AOSP zawiera przykładowe implementacje różnych agentów sieciowych. Na liście poniżej znajdziesz przykłady implementacji:

  • TelephonyNetworkAgent: wykorzystuje wynik sieci do przekazywania zasad dotyczących sieci komórkowych.
  • ClientModeImpl.WifiNetworkAgent: używa oceny sieci do przekazywania zasad dotyczących sieci Wi-Fi. Ta implementacja zapewnia zgodność wsteczną ze starszą liczbą całkowitą dla wyniku sieciowego przez użycie flagi POLICY_EXITING.

Urządzenia, które można zaktualizować do Androida 12

Producenci urządzeń, którzy aktualizują swoje urządzenia do Androida 12, muszą zmodyfikować implementacje agenta sieci, aby korzystać z klasy NetworkScore. Starsza liczba całkowita używana w Androidzie 11 lub starszym jest przekazywana w parametrze NetworkScore, ale w Androidzie 12 jest używana tylko do rejestrowania i testowania regresji. W Androidzie 12 producenci urządzeń muszą wyrażać zmiany za pomocą flag NetworkScore. Moduł Connectivity Mainline używa tych 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ą napotkać błędy kompilacji, ponieważ metody aktualizowania starszego typu integer zostały usunięte w Androidzie 12.

W przypadku agentów sieciowych, którzy używają wewnętrznej klasy NetworkFactory, musisz wyrazić filtr wyniku w obiekcie NetworkScore, który reprezentuje najwyższy 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 wyników zadeklarowanych w NetworkFactory. W Androidzie 11 i starszych wersjach przekazuje wszystkie żądania.

Możesz przekazać filtr, aby uprościć implementację i oszczędzać baterię, co sprawi, że NetworkFactory nie będzie przetwarzać wszystkich żądań. Jeśli jednak Twoja implementacja niestandardowa 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, przekaż filtr wyniku, który najdokładniej odzwierciedla najlepszy wynik, jaki może uzyskać fabryka. Pozwala to oszczędzać baterię, ponieważ zapobiega ocenie próśb, których fabryka nie może spełnić.

Weryfikacja

Aby sprawdzić działanie wyboru sieci na urządzeniu z Androidem, wykonaj te testy:

  • NetworkScoreTest Test CTS
  • NetworkRanker test jednostkowy

Nieprawidłowa implementacja może spowodować, że w aplikacjach, które korzystają z NetworkCallback, będą się pojawiać nieoczekiwane sieci. Obejmuje to wybór domyślnej sieci urządzenia (sieci, którą system wysyła do aplikacji, gdy używa wywołania zwrotnego sieci, np. z ConnectivityManager.registerDefaultNetworkCallback).

Innym możliwym problemem związanym z nieprawidłową implementacją jest szybkie rozładowywanie baterii. Dzieje się tak, gdy agent sieciowy jest uruchamiany z wynikiem, który nie pozwala mu kwalifikować się do żadnego żądania, i jest natychmiast wyłączany. Jeśli agent wielokrotnie się włącza i wyłącza, może to znacznie zużywać baterię.