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 Android das Standardnetzwerk für eine App auswählt.
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 (API-Level 30) und niedriger beschrieben.
Android 12
Auf Geräten mit Android 12 oder höher verwendet Android die Klasse NetworkScore, um verfügbare Netzwerke auszuwählen. Diese Klasse enthält Flags, die Richtlinienentscheidungen treffen. Jedes Flag steht für ein Netzwerkattribut, das für die Netzwerkauswahl wichtig ist.
Ein Netzwerk-Agent (NetworkAgent) verwendet das Flag POLICY_TRANSPORT_PRIMARY, um anzugeben, dass Android das Netzwerk bevorzugt, wenn mehrere Netzwerke desselben Transports vorhanden sind. Bei einem Dual-SIM-Gerät können Sie beispielsweise in den Einstellungen auswählen, welche SIM-Karte 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 getrennt wird. Die Qualität des WLANs verschlechtert sich beispielsweise, wenn ein Nutzer den Empfangsbereich des Netzwerks verlässt. Android vermeidet die Verwendung eines Netzwerks mit diesem Flag, wenn ein anderes Netzwerk ohne dieses Flag verfügbar ist. Jeder 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 Android ein Netzwerk mit dem Flag KEEP_CONNECTED_FOR_HANDOVER und der Methode NetworkScore.Builder.setKeepConnectedReason verbunden hält. Dieses KEEP_CONNECTED_FOR_HANDOVER-Flag kann potenziellen Netzwerken helfen. Mit diesem Flag kann ein Netzwerk-Agent ein Netzwerk auf einer sekundären WLAN-STA einrichten, ohne es zum primären Netzwerk zu machen, bis Android die Leistung des Netzwerks bewertet hat. Wenn ein Netzwerk-Agent dieses Flag nicht deklariert, beendet Android potenzielle Netzwerke, da keine Anfrage bearbeitet wird, bevor der Agent die Leistung eines Netzwerks bewertet.
Wenn zwei Netzwerke eine bestimmte Anfrage bearbeiten können und die Richtlinien gleichwertig sind, bevorzugt Android das Netzwerk, das die Anfrage bearbeitet. Wenn kein Netzwerk die Anfrage bedient, wählt Android eines der beiden aus. Dieses Netzwerk wird weiterhin bevorzugt, bis sich die Richtlinienkennzeichnungen ändern.
Die Funktion zur Netzwerkauswahl ist im Konnektivitätsmodul im Android Open Source Project (AOSP) implementiert. 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. Stattdessen müssen sie die Flags in NetworkScore verwenden, um Informationen zu Netzwerken zu übermitteln.
Android 11
Auf Geräten mit Android 11 oder niedriger wählt Android das Netzwerk anhand einer Ganzzahl aus, die von einem Netzwerk-Agenten (NetworkAgent) gesendet wird. Für jede Anfrage wählt Android das Netzwerk mit dem höchsten numerischen Wert aus, das die Anfrage erfüllen kann. Diese numerische Punktzahl setzt sich aus der Ganzzahl zusammen, die der Netzwerk-Agent sendet, sowie zusätzlichen Boni oder Strafen. Android wendet diese Boni oder Strafen basierend auf Bedingungen an, z. B. ob das Netzwerk validiert oder ein VPN ist. 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 Klasse NetworkScore ist für die Funktion zur Netzwerkauswahl von zentraler Bedeutung. Diese Klasse enthält die API und die Dokumentation für die verfügbaren Flags und die NetworkScore.Builder.setKeepConnectedReason-Methode.
Sie müssen die Klasse NetworkScore mit ihrer Builder-Klasse erstellen und sie während der Initialisierung an den NetworkAgent-Konstruktor übergeben. Sie können Netzwerkbewertungen jederzeit mit der Methode NetworkAgent#sendNetworkScore aktualisieren.
Beispiele für die Implementierung von Netzwerk-Agents
AOSP enthält Beispielimplementierungen verschiedener Netzwerk-Agents. Die folgende Liste enthält 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 bietet Abwärtskompatibilität mit dem alten Ganzzahlwert für die Netzwerkbewertung, indem das FlagPOLICY_EXITINGverwendet wird.
Geräte, die auf Android 12 aktualisiert werden
Gerätehersteller, die ihre Geräte auf Android 12 aktualisieren, müssen ihre Netzwerk-Agent-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 Änderungen mit NetworkScore-Flags angeben. Das Connectivity Mainline-Modul verwendet die Flags dann, um Entscheidungen zur Netzwerkauswahl zu treffen. Gerätehersteller, die Code für Android 11 oder niedriger verwenden, aber auf der Implementierung in Android 12 aufbauen, 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, müssen Sie den Score-Filter in einem NetworkScore-Objekt angeben, das den höchsten 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. In Android 11 und niedriger werden alle Anfragen weitergeleitet.NetworkFactory
Sie können einen Filter übergeben, um die Implementierung zu vereinfachen und Akku zu sparen. So wird sichergestellt, dass NetworkFactory nicht alle Anfragen verarbeitet. Wenn für Ihre benutzerdefinierte Implementierung jedoch erforderlich ist, dass alle Anfragen an NetworkFactory übergeben werden, können Sie NetworkFactory.registerIgnoringScore anstelle der regulären Methode NetworkFactory.register registrieren. Wenn Sie diese Methode verwenden, übergeben Sie einen Filter für die Punktzahl, der die beste Punktzahl, die die Factory erstellen kann, am genauesten darstellt.
So wird Akku gespart, da Anfragen, die die Fabrik nicht erfüllen kann, nicht ausgewertet werden.
Zertifizierungsstufe
So prüfen Sie das Verhalten bei der Netzwerkauswahl auf einem Android-Gerät:
NetworkScoreTestCTS-TestNetworkRanker– Unittest
Eine falsche Implementierung kann dazu führen, dass unerwartete Netzwerke an Apps zurückgegeben werden, wenn sie NetworkCallback verwenden. Dazu gehört auch die Auswahl des Standardnetzwerks des Geräts (das Netzwerk, das das System an eine App sendet, wenn es einen Netzwerk-Callback verwendet, z. B. mit ConnectivityManager.registerDefaultNetworkCallback).
Ein weiteres mögliches Problem bei einer falschen Implementierung ist ein starker Akkuverbrauch. Das passiert, wenn 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 hoch- und heruntergefahren wird, kann dies den Akku stark beanspruchen.