Выбор сети

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

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

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

Андроид 12

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

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

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

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

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

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

Андроид 11

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

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

Класс NetworkScore

Класс NetworkScore играет центральную роль в функции выбора сети. Он содержит API и документацию по доступным флагам и методу NetworkScore.Builder.setKeepConnectedReason .

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

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

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

  • TelephonyNetworkAgent : использует оценку сети для передачи политики для мобильных сетей.
  • 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, используйте следующие тесты:

  • Тест NetworkScoreTest CTS
  • Модульный тест NetworkRanker

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

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