Auf dieser Seite wird beschrieben, wie Android zwischen gleichzeitig verfügbaren Netzwerken auswählt. Dieser Netzwerkauswahlmechanismus wirkt sich darauf aus, wie Android App- und Systemnetzwerkanfragen erfüllt und wie das Standardnetzwerk für eine App ausgewählt wird.
Verhalten der Netzwerkauswahl
In diesem Abschnitt wird das Verhalten der Netzwerkauswahl für Geräte mit Android 12 oder höher und für Geräte mit Android 11 oder 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 die Entscheidungsfindung erforderlich sind. Jedes Flag repräsentiert semantisch ein Attribut eines Netzwerks, 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 dafür ist ein Dual-SIM-Gerät mit einem Schalter in den Einstellungen, über den der Nutzer 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 vor 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 sich die Qualität eines WLANs verschlechtert, wenn ein Nutzer den Bereich des Netzwerks verlässt. Android verwendet kein Netzwerk mit diesem Flag, wenn ein anderes Netzwerk ohne dieses Flag verfügbar ist. Jeder einzelne Netzwerk-Agent kann bestimmen, wann ein Netzwerk so stark beeinträchtigt ist, dass es als nicht mehr nutzbar eingestuft wird.
Mit der Klasse NetworkScore
kann ein Netzwerkagent auch mit dem Flag KEEP_CONNECTED_FOR_HANDOVER
und der Methode NetworkScore.Builder.setKeepConnectedReason
angeben, dass ein Netzwerk aufrechterhalten werden soll. Dieses Flag KEEP_CONNECTED_FOR_HANDOVER
ist nützlich für potenzielle Netzwerke, da ein Netzwerkagent ein Netzwerk auf einem sekundären WLAN-STA starten kann, ohne es zum primären Netzwerk zu machen, bis die Leistung des Netzwerks bewertet wurde. Wenn ein Netzwerkmitarbeiter diese Markierung nicht setzt, werden potenzielle Netzwerke aufgelöst, weil keine Anfragen bearbeitet werden, bevor der Mitarbeiter die Leistung eines Netzwerks bewerten kann.
Wenn zwei Netzwerke eine bestimmte Anfrage verarbeiten können und hinsichtlich der Richtlinien äquivalent sind, wird das Netzwerk bevorzugt, das aktuell die Anfrage verarbeitet. Wenn keines der Netzwerke die Anfrage ausliefert, wird eines der beiden ausgewählt. Dieses Netzwerk wird dann so lange bevorzugt, bis sich die Richtlinien-Flags ändern.
Die Implementierung der Netzwerkauswahl befindet sich im Netzwerkmodul in AOSP. Die Richtlinienlogik für die Netzwerkauswahl finden Sie 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 die erforderlichen Informationen zu Netzwerken zu übermitteln.
Android 11
Auf Geräten mit Android 11 oder niedriger führt Android die Netzwerkauswahl anhand einer einfachen Ganzzahl durch, die von den Implementierungen eines Netzwerk-Agenten (NetworkAgent
) gesendet wird. Für jede Anfrage wählt Android das Netzwerk mit der höchsten numerischen Bewertung aus, das die Anfrage erfüllen kann. Dieser numerische Wert besteht aus der vom Netzwerkagenten gesendeten Ganzzahl sowie zusätzlichen Boni oder Strafen, die basierend auf einer Reihe von Bedingungen vergeben werden, z. B. ob das Netzwerk validiert wurde oder ob es sich um ein VPN handelt. Einzelne Netzwerk-Agenten synchronisieren sich miteinander, um Richtlinienentscheidungen zu treffen.
Wenn zwei Netzwerke eine bestimmte Anfrage ausliefern können und dieselbe numerische Bewertung haben, ist das Verhalten nicht definiert.
Klasse „NetworkScore“
Die zentrale Klasse für die 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 die 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-Agenten
AOSP enthält Beispielimplementierungen verschiedener Netzwerkagenten. Hier einige Beispiele für Implementierungen:
TelephonyNetworkAgent
: Netzwerkbewertung wird verwendet, um die Richtlinie für Mobilfunknetze zu kommunizierenClientModeImpl.WifiNetworkAgent
: Verwendet den Netzwerkwert, um die Richtlinie für WLANs zu kommunizieren. Diese Implementierung ist abwärtskompatibel mit der bisherigen Ganzzahl für den Netzwerkwert mit dem FlagPOLICY_EXITING
.
Geräte, die auf Android 12 umgestellt werden
Gerätehersteller, die ihre Geräte auf Android 12 umstellen, müssen ihre Netzwerkagentenimplementierungen so ändern, dass die NetworkScore
-Klasse verwendet wird. Die in Android 11 oder niedriger verwendete Ganzzahl wird in NetworkScore
übergeben, aber in Android 12 nur zu Protokollierungs- und nicht zu Regressionszwecken verwendet.
Unter Android 12 müssen Gerätehersteller gewünschte Änderungen mit NetworkScore
-Flags angeben. Das Connectivity Mainline-Modul trifft dann anhand der Flags die Netzwerkauswahl. Gerätehersteller, die Code für Android 11 oder niedriger verwenden, aber bei der Implementierung in Android 12 mit Build-Fehlern rechnen, da die Methoden zum Aktualisieren der Legacy-Ganzzahl in Android 12 entfernt wurden.
Bei Netzwerk-Agenten, die die interne Klasse NetworkFactory
verwenden, muss der Bewertungsfilter in einem NetworkScore
-Objekt angegeben werden, das die höchste Bewertung eines Netzwerks darstellt, das die Factory erstellen kann. Das liegt daran, dass in Android 12 von der Klasse NetworkFactory
nur Anfragen übergeben werden, die den in NetworkFactory
deklarierten Punktzahlfilter entsprechen, und nicht alle Anfragen in Android 11 und niedriger.
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 alle Anfragen an NetworkFactory
übergeben werden müssen, können Sie anstelle der regulären Methode NetworkFactory.register
die Methode NetworkFactory.registerIgnoringScore
registrieren. Wenn Sie diese Methode verwenden, empfehlen wir, einen Bewertungsfilter zu übergeben, der den besten Wert darstellt, den die Fabrik erzielen kann. So wird der Akku geschont, da Anfragen, die die Fabrik nicht erfüllen kann, nicht ausgewertet werden.
Zertifizierungsstufe
Führen Sie die folgenden Tests aus, um das Verhalten der Netzwerkauswahl auf einem Android-Gerät zu prüfen:
NetworkScoreTest
CTS-TestNetworkRanker
Unittest
Eine falsche Implementierung kann dazu führen, dass Apps aufgrund der 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 durch einen Netzwerk-Agenten verursacht wird, der mit einem Wert gestartet wird, der ihn nicht für Anfragen qualifiziert, und sofort danach wieder heruntergefahren wird. Wenn der Agent wiederholt hinzugefügt und entfernt wird, kann dies viel Akkukapazität verbrauchen.