На этой странице описывается, как 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, используйте следующие тесты:
- Тест
NetworkScoreTest
CTS - Тестирование модуля
NetworkRanker
Неправильная реализация может привести к тому, что в ответ на использование NetworkCallback
приложениям будут возвращены неожиданные сети, включая выбор сети устройства по умолчанию (сети, которую система отправляет приложению, когда они используют сетевой обратный вызов с помощью ConnectivityManager.registerDefaultNetworkCallback
).
Другая возможная проблема с неправильной реализацией — это сильный разряд батареи, вызванный тем, что сетевой агент был запущен с оценкой, которая не позволяет ему претендовать на какой-либо запрос, и был немедленно сброшен. Если агента запускать и сбрасывать неоднократно, это может израсходовать много батареи.