Netzwerkauswahl

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.

Verhalten bei der Netzwerkauswahl

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 Flag POLICY_TRANSPORT_PRIMARY , 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 der Flagge POLICY_TRANSPORT_PRIMARY gegenüber einem Netzwerk ohne Flagge.

Ein Netzwerkagent verwendet das Flag POLICY_EXITING um ein Netzwerk zu identifizieren, das voraussichtlich bald die Verbindung trennen wird. Ein typisches Beispiel dafür ist, dass sich die Qualität eines Wi-Fi-Netzwerks verschlechtert, 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 ein Netzwerk so stark beeinträchtigt ist, dass es als beendet gilt.

Mit der NetworkScore Klasse kann ein Netzwerkagent außerdem mithilfe des KEEP_CONNECTED_FOR_HANDOVER -Flags und der NetworkScore.Builder.setKeepConnectedReason -Methode deklarieren, dass ein Netzwerk aufrechterhalten wird. Dieses KEEP_CONNECTED_FOR_HANDOVER Flag ist für zukünftige Netzwerke nützlich und ermöglicht es einem Netzwerkagenten, ein Netzwerk auf einer sekundären Wi-Fi-STA einzurichten, 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 abgeschaltet, weil sie keine Anfragen bearbeiten, bevor der Agent die Möglichkeit hat, die Leistung eines Netzwerks zu bewerten.

Wenn zwei Netzwerke eine bestimmte Anfrage bedienen können und aus politischer Sicht gleichwertig sind, wird bei der Auswahl das Netzwerk bevorzugt, das die Anfrage aktuell bedient. Wenn kein Netzwerk die Anfrage bedient, wählt es eines der beiden aus. Danach wird dieses Netzwerk weiterhin bevorzugt, bis sich die Richtlinienflags ändern.

Die Implementierung für die Netzwerkauswahlfunktion befindet sich im Konnektivitätsmodul in AOSP. Die Richtlinienlogik für die Netzwerkauswahl befindet 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 erforderliche 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 Bewertung setzt sich aus der vom Netzwerkagenten gesendeten Ganzzahl sowie zusätzlichen Boni oder Strafen zusammen, die auf einer Reihe von Bedingungen basieren, 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 den gleichen 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. Netzwerkbewertungen können jederzeit mit der Methode NetworkAgent#sendNetworkScore aktualisiert werden.

Beispiele für die Implementierung von Netzwerkagenten

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

  • TelephonyNetworkAgent : Verwendet die Netzwerkbewertung, um Richtlinien für Mobilfunknetze zu kommunizieren
  • ClientModeImpl.WifiNetworkAgent : Verwendet die Netzwerkbewertung, um Richtlinien für Wi-Fi-Netzwerke zu kommunizieren. Diese Implementierung umfasst Abwärtskompatibilität mit der alten Ganzzahl für die Netzwerkbewertung unter Verwendung des Flags POLICY_EXITING .

Geräte, die auf Android 12 aktualisiert werden

Gerätehersteller, die ihre Geräte auf Android 12 aktualisieren, müssen ihre Netzwerkagentenimplementierungen ändern, um die NetworkScore Klasse zu verwenden. Die in Android 11 oder niedriger verwendete Legacy-Ganzzahl wird in NetworkScore übergeben, in Android 12 jedoch 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 auf der Grundlage der Implementierung in Android 12 bauen, müssen mit Buildfehlern rechnen, da die Methoden zum Aktualisieren der alten 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, das die Factory erstellen kann. Dies liegt daran, dass die NetworkFactory Klasse in Android 12 nur Anfragen weiterleitet, die mit den für NetworkFactory deklarierten Bewertungsfiltern übereinstimmen, und nicht alle Anfragen in Android 11 und niedriger.

Für eine einfachere Implementierung und Batterieeinsparungen empfehlen wir die Verwendung eines Filters, sodass 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 Anfragen nicht ausgewertet werden, die die Fabrik nicht erfüllen kann.

Validierung

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

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 fehlerhafter Implementierung ist eine starke Batterieentladung, die dadurch verursacht wird, dass ein Netzwerkagent mit einer Punktzahl aufgerufen wird, die ihn für keine Anforderung qualifiziert, und unmittelbar danach abgeschaltet wird. Wenn der Agent wiederholt hoch- und heruntergefahren wird, kann dies viel Batterie verbrauchen.