Выбор сети

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

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

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

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

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

Функция выбора сети реализована в модуле Connectivity проекта 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 используйте следующие тесты:

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

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

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