Выбор сети

На этой странице описывается, как Android выбирает между одновременно доступными сетями. Этот механизм выбора сети влияет на то, как Android выполняет сетевые запросы приложений и системы, а также влияет на выбор сети по умолчанию для приложения.

Поведение при выборе сети

В этом разделе описывается поведение выбора сети для устройств под управлением Android 12 или выше и для устройств под управлением Android 11 и ниже.

Android 12

Для устройств , работающих под управлением Android 12 и выше, Android использует NetworkScore класс для выбора доступных сетей. Этот класс содержит ряд флагов, необходимых для принятия решений по политике. Каждый флаг семантически представляет атрибут сети, который важен для выбора сети.

Сетевой агент ( NetworkAgent ) использует POLICY_TRANSPORT_PRIMARY флаг , чтобы указать , что сеть является предпочтительным , когда несколько сетей одного и того же транспорта присутствуют. Типичным примером этого является устройство с двумя SIM-картами с переключателем в настройках, позволяющим пользователю выбирать, какую из SIM-карт использовать по умолчанию. В рамках данного транспорта, Android предпочитает сеть с POLICY_TRANSPORT_PRIMARY флагом по сети без флага.

Сетевой агент использует POLICY_EXITING флаг для идентификации сети , которая , как ожидается , чтобы отключить в ближайшее время . Типичный пример этого - когда качество сети Wi-Fi ухудшается, когда пользователь выходит из зоны действия сети. Android избегает использования сети с этим флагом, если доступна другая сеть без этого флага. Каждый отдельный сетевой агент может определить, когда сеть деградирует настолько, чтобы считаться выходящей из нее.

NetworkScore класс также позволяет сетевой агент заявить , что сеть будет постоянно используя KEEP_CONNECTED_FOR_HANDOVER флаг и NetworkScore.Builder.setKeepConnectedReason метод. Этот KEEP_CONNECTED_FOR_HANDOVER флаг полезен для будущих сетей , позволяющих сетевой агент , чтобы вывести сеть на вторичном Wi-Fi STA без его первичной сети , пока производительность телесети не оцениваются. Если сетевой агент не объявляет этот флаг, предполагаемые сети разрушаются за то, что они не обслуживают какой-либо запрос, прежде чем агент получит возможность оценить производительность сети.

Если две сети могут обслуживать данный запрос и эквивалентны с точки зрения политики, выбор предпочитает сеть, которая в настоящее время обслуживает запрос. Если ни одна сеть не обслуживает запрос, она выбирает одну из двух, после чего эта сеть остается предпочтительной до тех пор, пока не изменятся флаги политики.

Реализация для функции выбора сети в модуле подключения в AOSP. Логику политики для выбора сети можно найти в NetworkRanker классе и его помощники. Это означает , что производители устройств не могут напрямую настроить код выбора сети , но вместо этого должны использовать флаги в NetworkScore передать необходимую информацию о сетях.

Android 11

Для устройств , работающих под управлением Android 11 или ниже, выбор сети Android выполняет на основе простого целого числа отправленного из реализаций сетевого агента ( NetworkAgent ). Для каждого запроса Android выбирает сеть с наивысшей числовой оценкой, которая может удовлетворить запрос. Эта числовая оценка состоит из целого числа, отправленного сетевым агентом, плюс дополнительные бонусы или штрафы, назначаемые на основе ряда условий, например, проверена ли сеть или является ли сеть VPN. Отдельные сетевые агенты синхронизируются друг с другом для принятия политических решений.

Если две сети могут обслуживать данный запрос и иметь одинаковую числовую оценку, поведение не определено.

NetworkScore класс

Центральный класс для функции выбора сети NetworkScore . Этот класс содержит API и документацию доступных флагов и setKeepConnectedReason методы.

NetworkScore класс должен быть построен через строитель класса и передается в NetworkAgent конструктора при инициализации. Сетевые оценки могут быть обновлены в любое время с помощью NetworkAgent#sendNetworkScore метода.

Примеры реализации сетевого агента

AOSP включает в себя примеры реализации различных сетевых агентов. Ниже приведены примеры реализации:

  • DcNetworkAgent : Использует сетевой счет общаться политику для мобильных сетей
  • ClientModeImpl.WifiNetworkAgent : Использует сетевой счет общаться политики для сетей Wi-Fi. Эта реализация включает в себя обратную совместимость с унаследованным целым числом для сети счетов , используя POLICY_EXITING флаг.

Обновление устройств до Android 12

Производители устройств модернизации своих устройств Android 12 должны изменить их реализацию сетевых агентов использовать NetworkScore класс. Наследство целое число , используемое в Android 11 или ниже , передается в NetworkScore , но используется только для каротажа и не регрессионных целей в Android 12. В Android - 12, производители устройств должны выразить необходимые изменения , используя NetworkScore флаги. Затем модуль Connectivity Mainline использует флаги для принятия решения о выборе сети. Производители устройств, использующие код для Android 11 или более ранней версии, но опирающиеся на реализацию в Android 12, могут ожидать ошибок сборки, поскольку методы обновления устаревшего целого числа были удалены в Android 12.

Для сетевых агентов , которые используют внутренний NetworkFactory класса, они должны выразить свою оценку фильтр в NetworkScore объекте , представляющем самый сильный счет сети завод может создать. Это потому , что в Android 12, NetworkFactory класс только передает запросы, соответствующие фильтры оценка заявленных к NetworkFactory вместо всех запросов в Android 11 и ниже.

Мы рекомендуем поместить фильтр для облегчения реализации и батарейной экономии , так что не все запросы передаются NetworkFactory . Однако, если ваш заказ реализация требует , чтобы все запросы будут переданы NetworkFactory , вы можете зарегистрировать NetworkFactory.registerIgnoringScore вместо обычного NetworkFactory.register метода. При использовании этого метода мы рекомендуем передать фильтр оценок, который наиболее точно представляет лучшую оценку, которую может создать фабрика, чтобы сэкономить заряд батареи, не оценивая запросы, которые фабрика не может выполнить.

Проверка

Чтобы проверить поведение выбора сети на устройстве Android, используйте следующие тесты:

Неправильная реализация может привести к непредвиденным сетям возвращаются к приложениям в ответ на их использование NetworkCallback , включая выбор сети по умолчанию устройства (сеть система посылает в приложении , когда они используют сеть обратный вызов с ConnectivityManager.registerDefaultNetworkCallback ).

Другая возможная проблема с неправильной реализацией - это серьезный разряд батареи, вызванный тем, что сетевой агент запускается с оценкой, которая не позволяет ему отвечать ни одному запросу, и сразу же после этого удаляется. Если агент поднимать и разрывать неоднократно, это может привести к разрядке батареи.