Netzwerkauswahl

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 kommunizieren
  • ClientModeImpl.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 Flag POLICY_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:

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.