Выбор сети

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

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

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

Андроид 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 полезен для перспективных сетей, позволяя сетевому агенту поднять сеть на вторичной STA Wi-Fi, не делая ее основной сетью, пока не будет оценена производительность сети. Если сетевой агент не объявляет этот флаг, потенциальные сети отключаются из-за того, что они не обслуживают ни один запрос, прежде чем агент сможет оценить производительность сети.

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

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

Андроид 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 ).

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