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 mobilesClientModeImpl.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'optionPOLICY_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:
NetworkScoreTest
Test CTS- Test unitaire
NetworkRanker
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.