Auf dieser Seite wird beschrieben, wie Android zwischen gleichzeitig verfügbaren Netzwerken auswählt. Diese Netzwerkauswahl wirkt sich darauf aus, wie Android die App und das System ausführt Netzwerkanfragen und hat Einfluss darauf, wie das Standardnetzwerk für eine App ausgewählt wird.
Verhalten bei 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
eines Werbenetzwerks, 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 einer
in den Einstellungen, sodass der Nutzer auswählen kann, welche SIM-Karten
Standardeinstellung. Innerhalb eines bestimmten Transports bevorzugt Android ein Netzwerk mit dem POLICY_TRANSPORT_PRIMARY
-Flag vor einem Netzwerk ohne das Flag.
Ein Netzwerkagent 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 aktiv bleiben 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 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 Netzwerkauswahlfunktion befindet sich in der
Verbindungsmodul
bei AOSP. Die Richtlinienlogik für die Netzwerkauswahl finden Sie in der
NetworkRanker
und ihre 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
Bei Geräten mit Android 11 oder niedriger erfolgt die Netzwerkauswahl von Android
basierend auf einer einfachen Ganzzahl, die von den Implementierungen eines Netzwerk-Agents gesendet wird
(NetworkAgent
)
Android wählt für jede Anfrage das Werbenetzwerk mit dem höchsten numerischen Wert aus.
der die Anfrage erfüllen kann. Dieser numerische Wert setzt sich aus der Ganzzahl zusammen,
sowie zusätzliche Boni oder Strafen aufgrund eines
ob das Netzwerk validiert wurde oder
ein VPN ist. Einzelne Netzwerk-Agents synchronisieren sich der Reihe nach
um politische Entscheidungen zu treffen.
Wenn zwei Netzwerke eine bestimmte Anfrage ausliefern können und dieselbe numerische Bewertung haben, ist das Verhalten nicht definiert.
NetworkScore-Klasse
Die zentrale Klasse der Netzwerkauswahlfunktion 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 übergeben werden.
zu den
NetworkAgent
-Konstruktor
bei der Initialisierung an. Die Netzwerkwerte können jederzeit über die
NetworkAgent#sendNetworkScore
.
Implementierungsbeispiele für den Network Agent
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
: Nutzt die Netzwerkbewertung, um Richtlinien 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 muss den Netzwerk-Agent ändern
Implementierungen zur Verwendung der NetworkScore
-Klasse. 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.
Für Netzwerk-Agents, die das interne
NetworkFactory
Klasse, müssen sie ihren Punktzahlfilter in einem NetworkScore
-Objekt ausdrücken
der den höchsten Wert eines Netzwerks darstellt,
das die Fabrik erstellen kann. Dies ist
da in Android 12 nur die Klasse NetworkFactory
gibt Anfragen weiter, die mit den für NetworkFactory
angegebenen Punktzahlfiltern übereinstimmen.
anstelle aller 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. Bei Verwendung dieser Methode empfehlen wir, einen Bewertungsfilter zu übergeben,
die beste Wertung darstellt, die die Fabrik erstellen kann,
um den Akku zu schonen, indem Anfragen, die das Werk nicht erfüllen kann, nicht geprüft werden.
Zertifizierungsstufe
Um das Verhalten der Netzwerkauswahl auf einem Android-Gerät zu überprüfen, verwenden Sie die folgenden Tests:
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.