Sélection du réseau

Cette page décrit comment Android sélectionne les réseaux disponibles simultanément. Ce mécanisme de sélection du réseau affecte la façon dont Android répond aux requêtes réseau des applications et du système, et influence la façon dont Android choisit le réseau par défaut pour une application.

Comportement de la sélection du réseau

Cette section décrit le comportement de la sélection du réseau pour les appareils équipés d'Android 12 ou version ultérieure, ainsi que pour ceux équipés d'Android 11 (niveau d'API 30) ou version antérieure.

Android 12

Pour les appareils équipés d'Android 12 ou version ultérieure, Android utilise la classe NetworkScore pour sélectionner les réseaux disponibles. Cette classe contient des indicateurs qui prennent des décisions concernant les règles. Chaque indicateur représente un attribut de réseau important pour la sélection du réseau.

Un agent de réseau (NetworkAgent) utilise l'indicateur POLICY_TRANSPORT_PRIMARY pour spécifier qu'Android préfère le réseau si plusieurs réseaux du même transport sont présents. Par exemple, un appareil à double carte SIM dispose d'un bouton dans les Paramètres qui vous permet de choisir la carte SIM à utiliser par défaut. Dans un transport donné, Android préfère un réseau avec l'indicateur POLICY_TRANSPORT_PRIMARY à un réseau sans cet indicateur.

Un agent de réseau utilise l'indicateur POLICY_EXITING pour identifier un réseau qui devrait se déconnecter. Par exemple, la qualité du réseau Wi-Fi se dégrade si un utilisateur sort de la zone de couverture du réseau. Android évite d'utiliser un réseau avec cet indicateur si un autre réseau sans cet indicateur est disponible. Chaque agent de réseau peut déterminer quand un réseau se dégrade suffisamment pour être considéré comme sortant.

La classe NetworkScore permet également à un agent réseau de déclarer qu'Android maintient un réseau connecté à l'aide de l'indicateur KEEP_CONNECTED_FOR_HANDOVER et de la méthode NetworkScore.Builder.setKeepConnectedReason. Cette option KEEP_CONNECTED_FOR_HANDOVER aide les réseaux potentiels. Cet indicateur permet à un agent réseau de configurer un réseau sur une STA Wi-Fi secondaire sans en faire le réseau principal tant qu'Android n'a pas évalué les performances du réseau. Si un agent réseau ne déclare pas cet indicateur, Android détruit les réseaux potentiels qui ne répondent à aucune requête avant que l'agent n'évalue les performances d'un réseau.

Si deux réseaux peuvent répondre à une demande donnée et ont des règles équivalentes, Android préfère le réseau qui répond à la demande. Si aucun réseau ne répond à la requête, Android en choisit un parmi les deux. Ce réseau reste préféré jusqu'à ce que les indicateurs de règles changent.

La fonctionnalité de sélection du réseau est implémentée dans le module de connectivité du Projet Android Open Source (AOSP). La logique des règles de sélection du réseau se trouve dans la classe NetworkRanker et ses classes d'assistance. Cela signifie que les fabricants d'appareils ne peuvent pas personnaliser directement le code de sélection du réseau. Ils doivent à la place utiliser les indicateurs de NetworkScore pour transmettre des informations sur les réseaux.

Android 11

Pour les appareils équipés d'Android 11 ou version antérieure, Android sélectionne le réseau en fonction d'un nombre entier envoyé par un agent de réseau (NetworkAgent). Pour chaque demande, Android sélectionne le réseau ayant le score numérique le plus élevé et pouvant répondre à la demande. Ce score numérique est composé de l'entier envoyé par l'agent de réseau, ainsi que de bonus ou de pénalités supplémentaires. Android applique ces bonus ou pénalités en fonction de conditions, par exemple si le réseau est validé ou s'il s'agit d'un VPN. Les agents de réseau se synchronisent entre eux pour prendre des décisions concernant les règles.

Si deux réseaux peuvent diffuser une demande donnée et ont le même score numérique, le comportement n'est pas défini.

Classe NetworkScore

La classe NetworkScore est essentielle à la fonctionnalité de sélection du réseau. Cette classe contient l'API et la documentation pour les indicateurs disponibles et la méthode NetworkScore.Builder.setKeepConnectedReason.

Vous devez créer la classe NetworkScore à l'aide de sa classe de compilateur et la transmettre au constructeur NetworkAgent lors de l'initialisation. Vous pouvez mettre à jour les scores réseau à tout moment à l'aide de la méthode NetworkAgent#sendNetworkScore.

Exemples d'implémentation d'agents de réseau

AOSP inclut des exemples d'implémentations de différents agents réseau. La liste suivante fournit des exemples d'implémentations :

  • TelephonyNetworkAgent : utilise le score du réseau pour communiquer la règle concernant les réseaux mobiles.
  • ClientModeImpl.WifiNetworkAgent : utilise le score du réseau pour communiquer sur les règles concernant les réseaux Wi-Fi. Cette implémentation assure la rétrocompatibilité avec l'ancien entier pour le score réseau à l'aide de l'indicateur POLICY_EXITING.

Appareils passant à Android 12

Les fabricants d'appareils qui mettent à niveau leurs appareils vers Android 12 doivent modifier leurs implémentations d'agent réseau pour utiliser la classe NetworkScore. L'ancien entier utilisé dans Android 11 ou version antérieure est transmis dans NetworkScore, mais n'est utilisé qu'à des fins de journalisation et de non-régression dans Android 12. Dans Android 12, les fabricants d'appareils doivent exprimer les modifications à l'aide d'indicateurs NetworkScore. Le module Connectivity Mainline utilise ensuite les indicateurs pour prendre des décisions de sélection du réseau. Les fabricants d'appareils qui utilisent du code pour Android 11 ou version antérieure, mais qui compilent par rapport à l'implémentation dans Android 12, peuvent s'attendre à des erreurs de compilation, car les méthodes de mise à jour de l'ancien entier ont été supprimées dans Android 12.

Pour les agents de réseau qui utilisent la classe interne NetworkFactory, vous devez exprimer le filtre de score dans un objet NetworkScore qui représente le score le plus élevé d'un réseau que la fabrique peut créer. En effet, dans Android 12, la classe NetworkFactory ne transmet que les requêtes qui correspondent aux filtres de score déclarés à NetworkFactory, contrairement à Android 11 et aux versions antérieures, où elle transmet toutes les requêtes.

Vous pouvez transmettre un filtre pour simplifier l'implémentation et économiser la batterie, ce qui garantit que NetworkFactory ne traite pas toutes les requêtes. Toutefois, si votre implémentation personnalisée exige que toutes les requêtes soient transmises à NetworkFactory, vous pouvez enregistrer NetworkFactory.registerIgnoringScore au lieu de la méthode NetworkFactory.register habituelle. Si vous utilisez cette méthode, transmettez un filtre de score qui représente le plus précisément possible le meilleur score que l'usine peut créer. Cela permet d'économiser la batterie en empêchant l'évaluation des requêtes que l'usine ne peut pas traiter.

Validation

Pour vérifier le comportement de la sélection du réseau sur un appareil Android, utilisez les tests suivants :

  • Test CTS NetworkScoreTest
  • Test unitaire NetworkRanker

Une implémentation incorrecte peut entraîner le retour de réseaux inattendus dans les applications lorsqu'elles utilisent NetworkCallback. Cela inclut la sélection du réseau par défaut de l'appareil (le réseau que le système envoie à une application lorsqu'elle utilise un rappel réseau, par exemple avec ConnectivityManager.registerDefaultNetworkCallback).

Un autre problème possible lié à une implémentation incorrecte est une décharge importante de la batterie. Cela se produit lorsqu'un agent de réseau est créé avec un score qui ne lui permet de répondre à aucune demande et qu'il est immédiatement supprimé. Si l'agent est constamment activé et désactivé, cela peut consommer beaucoup de batterie.