Wybór sieci

Na tej stronie dowiesz się, 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.

Sposób wyboru 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

W przypadku urządzeń z Androidem 12 lub nowszym Android używa klasy NetworkScore do wybierania dostępnych 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 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ś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 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, system wybiera jedną z nich, a potem ta sieć jest preferowana do momentu zmiany flag zasad.

Implementacja funkcji wyboru sieci znajduje się w module Connectivity w AOSP. Logika zasady 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ć żą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ą wartość wyniku, zachowanie jest nieokreślone.

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 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 oceny sieci za pomocą flagi POLICY_EXITING.

urządzenia, które są aktualizowane do Androida 12;

Producenci urządzeń, którzy uaktualniają swoje urządzenia do Androida 12, muszą zmodyfikować implementacje agentów sieci, aby używały 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ą informować o pożądanych zmianach za pomocą flag NetworkScore. Następnie moduł Connectivity Mainline używa flag do podjęcia decyzji o wyborze sieci. Producenci urządzeń korzystający z kodu przeznaczonego na Androida 11 lub starszego, ale kompilujący 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.

Agenty sieciowe używające wewnętrznej klasy NetworkFactory muszą przekazać filtr wyników w obiekcie NetworkScore reprezentującym najniższy wynik sieci, jaki 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 korzystasz z tej metody, zalecamy przekazanie filtra wyniku, który najdokładniej odzwierciedla najlepszy wynik, jaki może utworzyć fabryka. Pozwoli to oszczędzać baterię, ponieważ nie analizuje żądań, których nie może spełnić fabryka.

Weryfikacja

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

Nieprawidłowa implementacja może spowodować, że aplikacje otrzymają 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łową implementacją jest znaczne zużycie baterii spowodowane tym, że agent sieci jest wywoływany z wynikiem, który nie pozwala mu spełniać kryteria żadnego żądania, a następnie jest natychmiast wyłączany. Wielokrotne podnoszenie i rozłączanie agenta może znacznie obciążać baterię.