Sélection du réseau

Cette page explique comment Android sélectionne les réseaux disponibles simultanément. Ce mécanisme de sélection du réseau affecte la manière dont Android traite les requêtes réseau des applications et du système, et influence la façon 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 de réseau pour les appareils équipés d'Android 12 ou version ultérieure, et pour les appareils équipés d'Android 11 ou version antérieure.

Android 12

Pour les appareils équipés d'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 requis pour prendre des décisions de stratégie. 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'option POLICY_TRANSPORT_PRIMARY pour spécifier que le réseau est privilégié lorsque plusieurs réseaux du même 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 l'indicateur POLICY_TRANSPORT_PRIMARY à 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 cette option si un autre réseau sans cette option est disponible. Chaque agent réseau individuel peut déterminer à quel moment 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, 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 cet indicateur, les réseaux potentiels sont détruits pour ne pas répondre à une requête avant que l'agent n'ait eu la possibilité d'évaluer les performances d'un réseau.

Si deux réseaux peuvent diffuser une requête donnée et qu'ils sont équivalents du point de vue de la règle, la sélection préfère le réseau qui diffuse actuellement la 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ègles 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 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 effectue une sélection du réseau en fonction d'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 y répondre. 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 les uns avec les autres pour prendre des décisions liées aux 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 centrale de la fonctionnalité de sélection de 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 transmise au 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. Voici des exemples d'implémentations:

  • TelephonyNetworkAgent : utilise le score réseau pour communiquer la stratégie pour les réseaux mobiles
  • ClientModeImpl.WifiNetworkAgent : utilise le score réseau pour communiquer la stratégie pour les réseaux Wi-Fi. Cette implémentation inclut la rétrocompatibilité avec l'ancien entier pour le score réseau à l'aide de l'indicateur 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é que pour la journalisation et la non-régression dans Android 12. Dans Android 12, les fabricants d'appareils doivent exprimer les modifications souhaitées à l'aide d'indicateurs NetworkScore. Le module principal de connectivité utilise ensuite les options 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'une fabrique réseau que la fabrique réseau peut créer. En effet, dans Android 12, la classe NetworkFactory ne transmet que les requêtes correspondant aux filtres de score déclarés à NetworkFactory, et non à toutes les requêtes sous Android 11 ou version antérieure.

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 qui représente le plus précisément le meilleur score que la fabrique peut créer afin d'économiser la batterie en ne évaluant pas les requêtes que l'usine ne peut pas traiter.

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