Sélection du réseau

Cette page explique 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 requêtes réseau de l'application 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 du réseau

Cette section décrit le comportement de sélection du réseau pour les appareils Android 12 ou version ultérieure, et pour les appareils équipés d'Android 11 et versions antérieures.

Android 12

Pour les appareils équipés d'Android 12 ou version ultérieure, Android utilise la NetworkScore pour choisir parmi les réseaux disponibles. Cette classe contient un certain nombre d'indicateurs requis pour prendre des décisions de stratégie. Chaque option représente sémantiquement d'un réseau qui est important pour la sélection du réseau.

Un agent réseau (NetworkAgent) utilise le POLICY_TRANSPORT_PRIMARY pour spécifier que le réseau est à privilégier lorsque plusieurs réseaux du même de transport sont présents. Un exemple typique est un appareil à double carte SIM avec un bouton dans les paramètres permettant à l'utilisateur de choisir la carte SIM à utiliser par défaut. Dans un transport donné, Android préfère un réseau avec POLICY_TRANSPORT_PRIMARY sur un réseau sans indicateur.

Un agent réseau utilise l'indicateur POLICY_EXITING pour identifier un réseau qui devrait se déconnecter prochainement. Par exemple, la qualité d'un réseau Wi-Fi se dégrade lorsque l'utilisateur s'éloigne 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 réseau peut déterminer quand un réseau se dégrade suffisamment pour être considéré comme en cours de sortie.

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, car il permet à un agent réseau de mettre en service un réseau sur un point d'accès Wi-Fi secondaire sans en faire le réseau principal tant que les performances du réseau n'ont pas été évaluées. Si un agent réseau ne déclare pas cette les réseaux potentiels sont supprimés, car aucune demande n'est traitée l'agent a la possibilité d'évaluer les performances d'un réseau.

Si deux réseaux peuvent répondre à une requête donnée et sont équivalents d'un point de règle la partie du réseau qui diffuse actuellement l'annonce requête. Si aucun réseau ne diffuse la requête, le système en choisit un parmi les deux. Ce réseau reste ensuite prioritaire jusqu'à ce que les indicateurs de stratégie changent.

L'implémentation de la fonctionnalité de sélection du réseau se trouve dans le module de connectivité d'AOSP. La logique de règle de sélection du réseau se trouve dans 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 utiliser les indicateurs dans NetworkScore pour transmettre les informations requises sur les réseaux.

Android 11

Pour les appareils équipés d'Android 11 ou version antérieure, Android sélectionne le réseau basé sur un entier simple envoyé par les implémentations d'un agent réseau (NetworkAgent). Pour chaque requête, Android sélectionne le réseau ayant le score numérique le plus élevé. pouvant répondre à la requête. Ce score numérique est composé de l'entier envoyé par l'agent réseau, ainsi que de bonus ou de pénalités supplémentaires attribués en fonction d'un certain nombre de conditions, par exemple si le réseau est validé ou s'il s'agit d'un VPN. Les agents réseau individuels se synchronisent entre eux dans l'ordre pour prendre des décisions stratégiques.

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 centrale de la fonctionnalité de sélection du réseau est NetworkScore Cette classe contient l'API et la documentation des indicateurs disponibles, ainsi que la méthode setKeepConnectedReason.

La classe NetworkScore doit être créée via sa classe de compilateur et être transmise. à la Constructeur NetworkAgent lors de l'initialisation. Les scores de 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 inclut des exemples d'implémentations de divers agents réseau. Les éléments suivants : sont des exemples d'implémentations:

  • TelephonyNetworkAgent : utilise le score réseau pour communiquer les règles concernant les réseaux mobiles
  • ClientModeImpl.WifiNetworkAgent: Utilise le score de réseau pour indiquer la règle de communication des réseaux Wi-Fi. Ce inclut la rétrocompatibilité avec l'ancien entier pour score réseau à l'aide de l'option POLICY_EXITING.

Appareils qui passent à Android 12

Les fabricants d'appareils qui passent à Android 12 doivent modifier leurs implémentations d'agent réseau pour utiliser la classe NetworkScore. L'entier ancien 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 indiquer les modifications souhaitées à l'aide d'options NetworkScore. Le module Connectivity Mainline puis utilise les indicateurs pour prendre la décision de sélection du réseau. Les fabricants d'appareils qui utilisent du code pour Android 11 ou version antérieure, mais qui compilent avec 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 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 l'usine 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 versions antérieures.

Nous vous recommandons de transmettre un filtre pour faciliter l'implémentation et économiser la batterie afin que toutes les requêtes ne soient pas transmises à NetworkFactory. Toutefois, si votre implémentation personnalisée nécessite que toutes les requêtes soient transmises à NetworkFactory, vous pouvez enregistrer NetworkFactory.registerIgnoringScore au lieu de la méthode NetworkFactory.register standard. Si vous utilisez cette méthode, nous vous recommandons de transmettre un filtre de score représente le plus précisément possible le meilleur score que l'usine peut créer pour d'économiser la batterie en n'évaluant pas les demandes 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 la les tests suivants:

Une implémentation incorrecte peut entraîner le renvoi de réseaux inattendus vers d'applications en réponse à leur utilisation NetworkCallback, notamment en sélectionnant le réseau par défaut de l'appareil (le réseau auquel le système envoie à l'application lorsqu'il utilise un rappel réseau avec ConnectivityManager.registerDefaultNetworkCallback).

Un autre problème possible lié à une implémentation incorrecte est une décharge de batterie importante causée par l'apparition d'un agent réseau avec un score qui ne lui permet pas de répondre à une requête et qui est détruit immédiatement après. Si l'agent est lancé et arrêté de manière répétée, cela peut consommer beaucoup de batterie.