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 Richtlinienentscheidungen erforderlich sind. Jedes Flag steht semantisch für 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 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. 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 NetworkScore
-Klasse 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 Netzwerk-Agent diese Flag nicht deklariert, werden potenzielle Netzwerke aufgelöst, weil keine Anfrage bearbeitet wird, bevor der Agent die Leistung eines Netzwerks bewerten kann.
Wenn zwei Netzwerke eine bestimmte Anfrage ausliefern können und aus Richtliniensicht gleichwertig sind, wird bei der Auswahl das Netzwerk bevorzugt, das die Anfrage derzeit ausliefert. 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 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 die erforderlichen Informationen zu Netzwerken zu übermitteln.
Android 11
Auf Geräten mit Android 11 oder niedriger erfolgt die Netzwerkauswahl basierend auf einer einfachen Ganzzahl, 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. Im Folgenden finden Sie einige Beispielimplementierungen:
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 aktualisiert 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 verwendet dann die Flags, um die Netzwerkauswahl zu treffen. Gerätehersteller, die Code für Android 11 oder niedriger verwenden, aber die Implementierung in Android 12 verwenden, können Buildfehler erwarten, da die Methoden zum Aktualisieren der alten 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 nur Anfragen an die NetworkFactory
-Klasse weitergeleitet werden, die mit den für NetworkFactory
deklarierten Bewertungsfiltern übereinstimmen, während in Android 11 und niedriger alle Anfragen weitergeleitet werden.
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 für keine Anfrage qualifiziert, und sofort danach wieder heruntergefahren wird. Wenn der Agent wiederholt gestartet und beendet wird, kann das den Akku stark beanspruchen.