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'indicateurPOLICY_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.