Netzwerkauswahl

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Auf dieser Seite wird beschrieben, wie Android zwischen gleichzeitig verfügbaren Netzwerken auswählt. Dieser Netzwerkauswahlmechanismus wirkt sich darauf aus, wie Android App- und Systemnetzwerkanforderungen erfüllt, und beeinflusst, wie das Standardnetzwerk für eine App ausgewählt wird.

Netzwerkauswahlverhalten

In diesem Abschnitt wird das Netzwerkauswahlverhalten für Geräte mit Android 12 oder höher und für Geräte mit Android 11 und niedriger beschrieben.

Android 12

Bei Geräten mit Android 12 oder höher verwendet Android die NetworkScore -Klasse, um zwischen verfügbaren Netzwerken auszuwählen. Diese Klasse enthält eine Reihe von Flags, die zum Treffen von Richtlinienentscheidungen erforderlich sind. Jedes Flag stellt semantisch ein Attribut eines Netzwerks dar, das für die Netzwerkauswahl wichtig ist.

Ein Netzwerkagent ( NetworkAgent ) verwendet das POLICY_TRANSPORT_PRIMARY Flag, um anzugeben, dass das Netzwerk bevorzugt wird, wenn mehrere Netzwerke desselben Transports vorhanden sind. Ein typisches Beispiel hierfür ist ein Dual-SIM-Gerät mit einem Schalter in den Einstellungen, mit dem der Benutzer auswählen kann, welche der SIM-Karten standardmäßig verwendet werden soll. Innerhalb eines bestimmten Transports bevorzugt Android ein Netzwerk mit dem POLICY_TRANSPORT_PRIMARY Flag gegenüber einem Netzwerk ohne das Flag.

Ein Netzwerkagent verwendet das POLICY_EXITING Flag, um ein Netzwerk zu identifizieren, von dem erwartet wird, dass es bald getrennt wird. Ein typisches Beispiel hierfür ist, wenn die Qualität eines Wi-Fi-Netzwerks abnimmt, wenn ein Benutzer die Reichweite des Netzwerks verlässt. Android vermeidet die Verwendung eines Netzwerks mit diesem Flag, wenn ein anderes Netzwerk ohne dieses Flag verfügbar ist. Jeder einzelne Netzwerkagent kann bestimmen, wann sich ein Netzwerk so weit verschlechtert, dass es als beendet betrachtet wird.

Die NetworkScore -Klasse ermöglicht es einem Netzwerkagenten auch zu deklarieren, dass ein Netzwerk unter Verwendung des KEEP_CONNECTED_FOR_HANDOVER Flags und der NetworkScore.Builder.setKeepConnectedReason -Methode aufrechterhalten wird. Dieses KEEP_CONNECTED_FOR_HANDOVER Flag ist nützlich für potenzielle Netzwerke, die es einem Netzwerkagenten ermöglichen, ein Netzwerk auf einer sekundären Wi-Fi-STA aufzubauen, ohne es zum primären Netzwerk zu machen, bis die Leistung des Netzwerks bewertet ist. Wenn ein Netzwerkagent dieses Flag nicht deklariert, werden potenzielle Netzwerke abgebaut, weil sie keine Anfrage bedienen, bevor der Agent die Möglichkeit hat, die Leistung eines Netzwerks zu bewerten.

Wenn zwei Netzwerke eine bestimmte Anforderung bedienen können und aus politischer Sicht gleichwertig sind, bevorzugt die Auswahl das Netzwerk, das die Anforderung derzeit bedient. Wenn kein Netzwerk die Anforderung bedient, wählt es eines der beiden aus, wonach dieses Netzwerk weiterhin bevorzugt wird, bis sich die Richtlinien-Flags ändern.

Die Implementierung für die Netzwerkauswahlfunktion befindet sich im Konnektivitätsmodul in AOSP. Die Richtlinienlogik für die Netzwerkauswahl findet sich in der NetworkRanker -Klasse und ihren Hilfsklassen. Dies bedeutet, dass Gerätehersteller den Netzwerkauswahlcode nicht direkt anpassen können, sondern stattdessen die Flags in NetworkScore verwenden müssen, um die erforderlichen Informationen über Netzwerke zu übermitteln.

Android 11

Bei Geräten mit Android 11 oder niedriger führt Android die Netzwerkauswahl basierend auf einer einfachen Ganzzahl durch, die von den Implementierungen eines Netzwerkagenten ( NetworkAgent ) gesendet wird. Für jede Anfrage wählt Android das Netzwerk mit der höchsten numerischen Punktzahl aus, das die Anfrage erfüllen kann. Diese numerische Punktzahl setzt sich aus der vom Netzwerkagenten gesendeten Ganzzahl und zusätzlichen Boni oder Strafen zusammen, die auf der Grundlage einer Reihe von Bedingungen vergeben werden, z. B. ob das Netzwerk validiert ist oder ob es sich bei dem Netzwerk um ein VPN handelt. Einzelne Netzwerkagenten synchronisieren sich miteinander, um Richtlinienentscheidungen zu treffen.

Wenn zwei Netzwerke eine bestimmte Anfrage bedienen können und denselben numerischen Wert haben, ist das Verhalten undefiniert.

NetworkScore-Klasse

Die zentrale Klasse für die Netzwerkauswahlfunktion ist NetworkScore . Diese Klasse enthält die API und Dokumentation der verfügbaren Flags und der setKeepConnectedReason Methode.

Die NetworkScore -Klasse muss über ihre Builder-Klasse erstellt und bei der Initialisierung an den NetworkAgent -Konstruktor übergeben werden. Netzwerk-Scores können jederzeit mit der NetworkAgent#sendNetworkScore Methode aktualisiert werden.

Beispiele für die Implementierung von Netzwerkagenten

AOSP enthält Beispielimplementierungen verschiedener Netzwerkagenten. Im Folgenden finden Sie Beispielimplementierungen:

  • DcNetworkAgent : Verwendet den Netzwerk-Score, um Richtlinien für mobile Netzwerke zu kommunizieren
  • ClientModeImpl.WifiNetworkAgent : Verwendet die Netzwerkpunktzahl, um Richtlinien für Wi-Fi-Netzwerke zu kommunizieren. Diese Implementierung umfasst die Abwärtskompatibilität mit der Legacy-Ganzzahl für die Netzwerkpunktzahl unter Verwendung des POLICY_EXITING Flags.

Geräte, die auf Android 12 aktualisieren

Gerätehersteller, die ihre Geräte auf Android 12 aktualisieren, müssen ihre Netzwerk-Agent-Implementierungen ändern, um die NetworkScore -Klasse zu verwenden. Die alte Ganzzahl, die in Android 11 oder niedriger verwendet wird, wird in NetworkScore übergeben, aber in Android 12 nur für Protokollierungs- und Nicht-Regressionszwecke verwendet. In Android 12 müssen Gerätehersteller gewünschte Änderungen mithilfe von NetworkScore -Flags ausdrücken. Das Connectivity Mainline-Modul verwendet dann die Flags, um die Netzwerkauswahlentscheidung zu treffen. Gerätehersteller, die Code für Android 11 oder niedriger verwenden, aber gegen die Implementierung in Android 12 aufbauen, können mit Build-Fehlern rechnen, da die Methoden zum Aktualisieren der Legacy-Ganzzahl in Android 12 entfernt wurden.

Für Netzwerkagenten, die die interne NetworkFactory -Klasse verwenden, müssen sie ihren Bewertungsfilter in einem NetworkScore -Objekt ausdrücken, das die stärkste Bewertung eines Netzwerks darstellt, die die Factory erstellen kann. Dies liegt daran, dass die NetworkFactory -Klasse in Android 12 nur Anforderungen weiterleitet, die mit den für NetworkFactory deklarierten Score-Filtern übereinstimmen, und nicht alle Anforderungen in Android 11 und niedriger.

Wir empfehlen, einen Filter für eine einfachere Implementierung und Batterieeinsparung zu übergeben, damit nicht alle Anfragen an NetworkFactory weitergeleitet werden. Wenn Ihre benutzerdefinierte Implementierung jedoch erfordert, dass alle Anforderungen an NetworkFactory übergeben werden, können Sie NetworkFactory.registerIgnoringScore anstelle der regulären Methode NetworkFactory.register registrieren. Wenn Sie diese Methode verwenden, empfehlen wir, einen Bewertungsfilter zu übergeben, der die beste Bewertung, die die Fabrik erstellen kann, am genauesten darstellt, um Batterie zu sparen, indem Anforderungen nicht bewertet werden, die die Fabrik nicht erfüllen kann.

Validierung

Verwenden Sie die folgenden Tests, um das Verhalten der Netzwerkauswahl auf einem Android-Gerät zu überprüfen:

Eine falsche Implementierung kann dazu führen, dass unerwartete Netzwerke als Reaktion auf die Verwendung von NetworkCallback an Apps zurückgegeben werden, einschließlich der Auswahl des Standardnetzwerks des Geräts (das Netzwerk, das das System an die App sendet, wenn sie einen Netzwerkrückruf mit ConnectivityManager.registerDefaultNetworkCallback verwenden).

Ein weiteres mögliches Problem bei falscher Implementierung ist ein starker Batterieverbrauch, der dadurch verursacht wird, dass ein Netzwerkagent mit einer Punktzahl angesprochen wird, die ihn nicht für eine Anfrage qualifiziert, und unmittelbar danach abgebaut wird. Wenn der Agent wiederholt hochgefahren und heruntergefahren wird, kann dies viel Batterie verbrauchen.