Sélection de réseau

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, ainsi que 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 choisir entre les réseaux disponibles. Cette classe contient un certain nombre d'indicateurs nécessaires pour prendre des décisions politiques. Chaque indicateur représente sémantiquement un attribut d'un réseau important pour la sélection du réseau.

Un agent 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 Paramètres pour permettre à l'utilisateur de choisir laquelle des cartes SIM utiliser par défaut. Au sein d'un transport donné, Android préfère un réseau avec l'indicateur POLICY_TRANSPORT_PRIMARY à un réseau sans cet indicateur.

Un agent réseau utilise l'indicateur POLICY_EXITING pour identifier un réseau qui devrait bientôt se déconnecter. Un exemple typique est celui où 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 cet indicateur si un autre réseau sans cet indicateur est disponible. Chaque agent réseau individuel peut déterminer le moment où un réseau se dégrade suffisamment pour être considéré comme en cours de fermeture.

La classe NetworkScore permet également à un agent réseau de déclarer qu'un réseau est 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 réseau d'afficher un réseau sur une STA Wi-Fi secondaire sans en faire le réseau principal jusqu'à ce que les performances du réseau soient évaluées. Si un agent réseau ne déclare pas cet indicateur, les réseaux potentiels sont détruits pour ne répondre à aucune demande avant que l'agent n'ait la possibilité d'évaluer les performances d'un réseau.

Si deux réseaux peuvent répondre à une demande donnée et sont équivalents d'un point de vue politique, la sélection préfère le réseau qui répond actuellement à la demande. Si aucun réseau ne répond à 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 fonctionnalité 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 d'assistance. Cela signifie que les fabricants d'appareils ne peuvent pas personnaliser directement le code de sélection du réseau, mais doivent plutôt utiliser les indicateurs de 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é par les implémentations d'un agent 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 réseau plus des bonus ou pénalités supplémentaires accordé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 de 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 requête donnée et avoir le même score numérique, le comportement n'est pas défini.

Classe NetworkScore

La classe centrale de 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 builder et 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 de mise en œuvre d'agent réseau

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

  • TelephonyNetworkAgent : utilise le score du réseau pour communiquer la politique des réseaux mobiles
  • ClientModeImpl.WifiNetworkAgent : utilise le score réseau pour communiquer la politique des réseaux Wi-Fi. Cette implémentation inclut une compatibilité descendante avec l'entier hérité pour le score 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 réseau qui utilisent la classe NetworkFactory interne, 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 transmet uniquement les requêtes qui correspondent aux filtres de score déclarés à NetworkFactory au lieu de toutes les requêtes dans Android 11 et 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 demandes 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 répondre.

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 en cas de mise en œuvre incorrecte est une décharge importante de la batterie provoquée par un agent réseau qui affiche un score qui ne lui permet pas de répondre à une demande et qui est détruit immédiatement après. Si l'agent est démarré et démonté à plusieurs reprises, cela peut consommer beaucoup de batterie.