Netzwerkauswahl

Auf dieser Seite wird beschrieben, wie Android zwischen gleichzeitig verfügbaren Netzwerken auswählt. Dieser Mechanismus zur Netzwerkauswahl wirkt sich darauf aus, wie Android App- und Systemnetzwerkanfragen ausführt, und beeinflusst, wie das Standardnetzwerk für eine App ausgewählt wird.

Verhalten bei der Netzwerkauswahl

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

Android 12

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

Ein Netzwerk-Agent (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 Nutzer auswählen kann, welche der SIM-Karten standardmäßig verwendet werden soll. Bei einem bestimmten Transport bevorzugt Android ein Netzwerk mit dem Flag POLICY_TRANSPORT_PRIMARY gegenüber einem Netzwerk ohne das Flag.

Ein Netzwerk-Agent verwendet das Flag POLICY_EXITING, um ein Netzwerk zu identifizieren, das voraussichtlich bald getrennt wird. Ein typisches Beispiel hierfür ist, wenn die Qualität eines WLANs nachlässt, wenn ein Nutzer sich aus dem Empfangsbereich des Netzwerks entfernt. Android vermeidet die Verwendung eines Netzwerks mit diesem Flag, wenn ein anderes Netzwerk ohne dieses Flag verfügbar ist. Jeder einzelne Netzwerk-Agent kann festlegen, wann ein Netzwerk so stark beeinträchtigt ist, dass es als beendet betrachtet werden kann.

Mit der Klasse NetworkScore kann ein Netzwerk-Agent auch deklarieren, dass ein Netzwerk mit dem Flag KEEP_CONNECTED_FOR_HANDOVER und der Methode NetworkScore.Builder.setKeepConnectedReason aufrechterhalten werden soll. Das Flag KEEP_CONNECTED_FOR_HANDOVER ist für potenzielle Netzwerke nützlich, da ein Netzwerkagent ein Netzwerk auf einer sekundären WLAN-STA einrichten kann, ohne es zum primären Netzwerk zu machen, bis die Leistung des Netzwerks bewertet wurde. Wenn ein Netzwerk-Agent dieses Flag nicht deklariert, werden potenzielle Netzwerke abgebaut, weil sie keine Anfragen bedienen, bevor der Agent die Leistung eines Netzwerks bewerten kann.

Wenn zwei Netzwerke eine bestimmte Anfrage bearbeiten können und aus Richtliniensicht gleichwertig sind, wird das Netzwerk ausgewählt, das die Anfrage derzeit bearbeitet. Wenn kein Netzwerk die Anfrage bedient, wird eines der beiden ausgewählt. Dieses Netzwerk wird dann weiterhin bevorzugt, bis sich die Richtlinienkennzeichnungen ändern.

Die Implementierung für die Funktion zur Netzwerkauswahl befindet sich im Konnektivitätsmodul in AOSP. Die Richtlinienlogik für die Netzwerkauswahl befindet sich in der Klasse NetworkRanker und ihren Hilfsklassen. Das bedeutet, dass Gerätehersteller den Code für die Netzwerkauswahl nicht direkt anpassen können, sondern stattdessen die Flags in NetworkScore verwenden müssen, um erforderliche Informationen zu Netzwerken zu übermitteln.

Android 11

Auf Geräten mit Android 11 oder niedriger wählt Android das Netzwerk anhand einer einfachen Ganzzahl aus, die von den Implementierungen eines Netzwerk-Agents gesendet wird (NetworkAgent). Für jede Anfrage wählt Android das Netzwerk mit dem höchsten numerischen Wert aus, das die Anfrage erfüllen kann. Dieser numerische Wert setzt sich aus der vom Netzwerk-Agent 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 um ein VPN handelt. Einzelne Netzwerk-Agents werden miteinander synchronisiert, um Richtlinienentscheidungen zu treffen.

Wenn zwei Netzwerke eine bestimmte Anfrage bedienen können und dieselbe numerische Punktzahl haben, ist das Verhalten nicht definiert.

Klasse NetworkScore

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

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 Netzwerk-Agents

AOSP enthält Beispielimplementierungen verschiedener Netzwerk-Agents. Im Folgenden finden Sie Beispielimplementierungen:

  • TelephonyNetworkAgent: Verwendet den Netzwerk-Score, um die Richtlinie für Mobilfunknetze zu kommunizieren
  • ClientModeImpl.WifiNetworkAgent: Verwendet den Netzwerk-Score, um die Richtlinie für WLANs zu kommunizieren. Diese Implementierung umfasst die Abwärtskompatibilität mit der Legacy-Ganzzahl für den Netzwerk-Score mit dem Flag POLICY_EXITING.

Geräte, die auf Android 12 aktualisiert werden

Gerätehersteller, die ihre Geräte auf Android 12 aktualisieren, müssen ihre Netzwerkagent-Implementierungen so ändern, dass die Klasse NetworkScore verwendet wird. Die Legacy-Ganzzahl, die in Android 11 oder niedriger verwendet wird, wird in NetworkScore übergeben, aber in Android 12 nur für Protokollierungs- und Nicht-Regressionstests verwendet. In Android 12 müssen Gerätehersteller gewünschte Änderungen mit NetworkScore-Flags angeben. Das Connectivity Mainline-Modul verwendet dann die Flags, um die Netzwerkauswahl zu treffen. Gerätehersteller, die Code für Android 11 oder niedriger verwenden, aber für die Implementierung in Android 12 entwickeln, müssen mit Build-Fehlern rechnen, da die Methoden zum Aktualisieren des alten Integer in Android 12 entfernt wurden.

Für Netzwerk-Agents, die die interne Klasse NetworkFactory verwenden, muss der Score-Filter in einem NetworkScore-Objekt ausgedrückt werden, das den stärksten Score eines Netzwerks darstellt, das die Factory erstellen kann. Das liegt daran, dass in Android 12 die Klasse NetworkFactory nur Anfragen weiterleitet, die den deklarierten Score-Filtern entsprechen, anstatt wie in Android 11 und niedriger alle Anfragen.NetworkFactory

Wir empfehlen, einen Filter zu übergeben, um die Implementierung zu vereinfachen und den Akku zu schonen, damit nicht alle Anfragen an NetworkFactory übergeben werden. Wenn für Ihre benutzerdefinierte Implementierung jedoch erforderlich ist, dass alle Anfragen an NetworkFactory übergeben werden, können Sie stattdessen NetworkFactory.registerIgnoringScore anstelle der regulären Methode NetworkFactory.register registrieren. Wenn Sie diese Methode verwenden, empfehlen wir, einen Score-Filter zu übergeben, der den besten Score, den die Fabrik erstellen kann, am genauesten darstellt. So können Sie Akku sparen, da Anfragen, die die Fabrik nicht erfüllen kann, nicht ausgewertet werden.

Zertifizierungsstufe

So prüfen Sie das Verhalten der Netzwerkauswahl auf einem Android-Gerät:

Eine falsche Implementierung kann dazu führen, dass Apps als Reaktion auf die Verwendung von NetworkCallback unerwartete Netzwerke zurückgegeben werden. Dazu gehört auch die Auswahl des Standardnetzwerks des Geräts (das Netzwerk, das das System an die App sendet, wenn sie einen Netzwerk-Callback mit ConnectivityManager.registerDefaultNetworkCallback verwendet).

Ein weiteres mögliches Problem bei einer falschen Implementierung ist ein starker Akkuverbrauch, der dadurch verursacht wird, dass ein Netzwerk-Agent mit einem Score gestartet wird, der ihn für keine Anfrage qualifiziert, und er sofort wieder beendet wird. Wenn der Agent wiederholt gestartet und beendet wird, kann das viel Akku verbrauchen.