На этой странице описано, как Android выбирает между одновременно доступными сетями. Этот механизм влияет на то, как Android выполняет сетевые запросы приложений и системы, а также на то, как Android выбирает сеть по умолчанию для приложения.
Поведение при выборе сети
В этом разделе описано поведение при выборе сети на устройствах с Android 12 или более поздней версии, а также на устройствах с Android 11 (уровень API 30) и более ранних версий.
Android 12
На устройствах с Android 12 или более поздней версией ОС для выбора доступных сетей используется класс 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, не делая ее основной, пока Android не оценит ее производительность. Если сетевой агент не объявит этот флаг, Android удалит потенциальные сети, поскольку они не обслуживают запросы до того, как агент оценит производительность сети.
Если два сервиса могут выполнить запрос и их правила эквивалентны, Android предпочтет тот, который выполняет запрос. Если ни одна сеть не обслуживает запрос, Android выбирает одну из двух. Эта сеть будет оставаться предпочтительной, пока не изменятся флаги правил.
Функция выбора сети реализована в модуле подключения в Android Open Source Project (AOSP). Логика правил для выбора сети находится в классе NetworkRanker и его вспомогательных классах. Это означает, что производители устройств не могут напрямую настраивать код выбора сети. Вместо этого они должны использовать флаги в NetworkScore, чтобы передавать информацию о сетях.
Android 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, выполните следующие тесты:
- Тест CTS
NetworkScoreTest NetworkRankerмодульное тестирование
Неправильная реализация может привести к тому, что при использовании NetworkCallback в приложениях будут появляться неожиданные сети. В частности, это относится к выбору сети по умолчанию (сети, которую система отправляет приложению, когда оно использует обратный вызов сети, например с помощью ConnectivityManager.registerDefaultNetworkCallback).
Ещё одна возможная проблема при неправильной реализации – быстрый расход заряда батареи. Это происходит, когда агент сети запускается с оценкой, которая не позволяет ему соответствовать ни одному запросу, и сразу же отключается. Если агент постоянно подключается и отключается, это может значительно разрядить батарею.