Выбор сети

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

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

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

Андроид 11

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

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

Класс NetworkScore

Центральным классом для функции выбора сети является NetworkScore . Этот класс содержит API и документацию по доступным флагам, а также метод 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-устройстве, используйте следующие тесты:

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

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