Выбор сети

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

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

Реализация функции выбора сети находится в модуле подключения в 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 ).

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