Sélection de réseau

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Cette page décrit comment Android sélectionne les réseaux disponibles simultanément. Ce mécanisme de sélection de réseau affecte la manière dont Android répond aux demandes de réseau des applications et du système, et influence la manière dont le réseau par défaut d'une application est choisi.

Comportement de sélection de réseau

Cette section décrit le comportement de sélection du réseau pour les appareils exécutant Android 12 ou version ultérieure et pour les appareils exécutant Android 11 et version antérieure.

Android 12

Pour les appareils exécutant Android 12 ou version ultérieure, Android utilise la classe NetworkScore pour sélectionner les réseaux disponibles. Cette classe contient un certain nombre d'indicateurs requis pour prendre des décisions de politique. Chaque indicateur représente sémantiquement un attribut d'un réseau qui est important pour la sélection du réseau.

Un agent de réseau ( NetworkAgent ) utilise l'indicateur POLICY_TRANSPORT_PRIMARY pour spécifier que le réseau est préféré lorsque plusieurs réseaux du même transport sont présents. Un exemple typique de ceci est un appareil à double SIM avec un commutateur dans les paramètres pour permettre à l'utilisateur 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 indicateur.

Un agent de réseau utilise l'indicateur POLICY_EXITING pour identifier un réseau qui devrait bientôt se déconnecter. Un exemple typique de ceci est lorsque la qualité d'un réseau Wi-Fi se dégrade lorsqu'un utilisateur sort de la portée du réseau. Android évite d'utiliser un réseau avec ce drapeau si un autre réseau sans ce drapeau est disponible. Chaque agent de réseau individuel 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'un réseau doit être maintenu à l'aide de l'indicateur KEEP_CONNECTED_FOR_HANDOVER et de la méthode NetworkScore.Builder.setKeepConnectedReason . Cet indicateur KEEP_CONNECTED_FOR_HANDOVER est utile pour les réseaux potentiels permettant à un agent de réseau d'afficher un réseau sur un Wi-Fi STA secondaire sans en faire le réseau principal jusqu'à ce que les performances du réseau soient évaluées. Si un agent de réseau ne déclare pas cet indicateur, les réseaux potentiels sont détruits car ils ne traitent aucune demande avant que l'agent n'ait la possibilité d'évaluer les performances d'un réseau.

Si deux réseaux peuvent servir une demande donnée et sont équivalents d'un point de vue politique, la sélection préfère le réseau qui sert actuellement la demande. Si aucun réseau ne sert la demande, il choisit l'un des deux, après quoi ce réseau continue d'être préféré jusqu'à ce que les indicateurs de politique changent.

L'implémentation de la fonction de sélection de réseau se trouve dans le module Connectivité d'AOSP. La logique de politique pour la sélection de réseau se trouve dans la classe NetworkRanker et ses classes auxiliaires. Cela signifie que les fabricants d'appareils ne peuvent pas personnaliser directement le code de sélection de réseau, mais doivent plutôt utiliser les indicateurs dans NetworkScore pour transmettre les informations requises sur les réseaux.

Android 11

Pour les appareils exécutant Android 11 ou une version antérieure, Android effectue une sélection de réseau basée sur un simple entier envoyé à partir des implémentations d'un agent de réseau ( NetworkAgent ). Pour chaque requête, Android sélectionne le réseau avec le score numérique le plus élevé pouvant satisfaire la requête. Ce score numérique est composé de l'entier envoyé par l'agent de réseau plus des bonus ou des pénalités supplémentaires donnés en fonction d'un certain nombre de conditions telles que si le réseau est validé ou si le réseau est un VPN. Les agents réseau individuels se synchronisent les uns avec les autres afin de prendre des décisions politiques.

Si deux réseaux peuvent répondre à une demande donnée et avoir le même score numérique, le comportement est indéfini.

Classe NetworkScoreNetworkScore class

La classe centrale pour la fonctionnalité de sélection de réseau est NetworkScore . Cette classe contient l'API et la documentation des indicateurs disponibles et la méthode setKeepConnectedReason .

La classe NetworkScore doit être construite via sa classe de générateur et être transmise au constructeur NetworkAgent lors de l'initialisation. Les scores réseau peuvent être mis à jour à tout moment à l'aide de la méthode NetworkAgent#sendNetworkScore .

Exemples d'implémentation d'agent réseau

AOSP comprend des exemples d'implémentations de divers agents de réseau. Voici des exemples d'implémentation :

  • DcNetworkAgent : utilise le score du réseau pour communiquer la politique des réseaux mobiles
  • ClientModeImpl.WifiNetworkAgent : utilise le score du réseau pour communiquer la politique des réseaux Wi-Fi. Cette implémentation inclut la rétrocompatibilité avec l'entier hérité pour le score de réseau à l'aide de l'indicateur POLICY_EXITING .

Appareils mis à niveau vers Android 12

Les fabricants d'appareils mettant à niveau leurs appareils vers Android 12 doivent modifier leurs implémentations d'agent réseau pour utiliser la classe NetworkScore . L'entier hérité 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 souhaitées à l'aide des indicateurs NetworkScore . Le module Connectivity Mainline utilise ensuite les indicateurs pour prendre la décision de sélection du réseau. Les fabricants d'appareils utilisant du code pour Android 11 ou une version antérieure, mais s'appuyant sur l'implémentation dans Android 12, peuvent s'attendre à des erreurs de construction car les méthodes de mise à jour de l'entier hérité ont été supprimées dans Android 12.

Pour les agents de réseau qui utilisent la classe interne NetworkFactory , ils doivent exprimer leur filtre de score dans un objet NetworkScore représentant 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 au lieu de toutes les requêtes dans Android 11 et les versions antérieures.

Nous vous recommandons de passer un filtre pour une mise en œuvre plus facile et des économies de batterie afin que toutes les requêtes ne soient pas transmises à NetworkFactory . Toutefois, si votre implémentation personnalisée nécessite que toutes les demandes soient transmises à NetworkFactory , vous pouvez enregistrer NetworkFactory.registerIgnoringScore au lieu de la méthode NetworkFactory.register habituelle. Si vous utilisez cette méthode, nous vous recommandons de passer un filtre de score qui représente le plus précisément le meilleur score que l'usine peut créer afin d'économiser la batterie en n'évaluant pas les demandes que l'usine ne peut pas satisfaire.

Validation

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

Une implémentation incorrecte peut entraîner le renvoi de réseaux inattendus aux applications en réponse à leur utilisation de NetworkCallback , y compris la sélection du réseau par défaut de l'appareil (le réseau que le système envoie à l'application lorsqu'elle utilise un rappel réseau avec ConnectivityManager.registerDefaultNetworkCallback ).

Un autre problème possible avec une implémentation incorrecte est la décharge importante de la batterie causée par le fait qu'un agent réseau est amené avec un score qui ne le laisse pas se qualifier pour une demande et est détruit immédiatement après. Si l'agent est mis en place et détruit à plusieurs reprises, cela peut utiliser beaucoup de batterie.