Selezione rete

In questa pagina viene descritto come Android sceglie tra reti disponibili contemporaneamente. Questo meccanismo di selezione della rete influisce sul modo in cui Android soddisfa le richieste di rete di app e sistema e sulla scelta della rete predefinita per un'app.

Comportamento di selezione della rete

Questa sezione descrive il comportamento di selezione della rete per i dispositivi con Android 12 o versioni successive e per i dispositivi con Android 11 e versioni precedenti.

Android 12

Per i dispositivi con Android 12 o versioni successive, Android utilizza la classe NetworkScore per scegliere tra le reti disponibili. Questo corso contiene un certo numero di per prendere decisioni in merito alle norme. Ogni flag rappresenta semanticamente un di una rete importante per la selezione della rete.

Un agente di rete (NetworkAgent) utilizza il POLICY_TRANSPORT_PRIMARY flag per specificare che la rete è preferita quando sono presenti più reti dello stesso trasporto. Un esempio tipico è un dispositivo dual SIM con un pulsante nelle Impostazioni che consente all'utente di scegliere quale delle schede SIM utilizzare per impostazione predefinita. All'interno di un determinato trasporto, Android preferisce una rete con POLICY_TRANSPORT_PRIMARY su una rete senza il flag.

Un agente di rete utilizza POLICY_EXITING per identificare una rete che dovrebbe disconnettersi a breve. Un tipico Questo è il caso in cui la qualità di una rete Wi-Fi peggiora quando un utente esce di rete. Android evita di utilizzare una rete con questo flag se un'altra la rete senza questo flag è disponibile. Ogni singolo agente di rete può Stabilire quando una rete ha un peggioramento sufficientemente elevato da essere considerata come uscente.

La classe NetworkScore consente inoltre a un agente di rete di dichiarare che una rete deve essere aggiornata utilizzando il flag KEEP_CONNECTED_FOR_HANDOVER e il metodo NetworkScore.Builder.setKeepConnectedReason. Questo KEEP_CONNECTED_FOR_HANDOVER è utile per le reti potenziali consentendo a un agente di rete di richiamare rete su un'STA Wi-Fi secondaria senza renderla la rete principale fino a quando vengono valutate le prestazioni della rete. Se un agente di rete non lo dichiara le potenziali reti vengono rimosse per non gestire alcuna richiesta prima l'agente ha la possibilità di valutare le prestazioni di una rete.

Se due reti possono gestire una determinata richiesta e sono equivalenti da un punto del criterio la selezione preferisce la rete che attualmente offre richiesta. Se nessuna rete pubblica la richiesta, ne viene scelta una tra le due, che poi continuerà a essere preferita fino a quando i flag dei criteri non cambieranno.

L'implementazione della funzione di selezione della rete è Modulo Connettività in AOSP. La logica del criterio per la selezione della rete si trova nella NetworkRanker e le relative classi helper. Ciò significa che i produttori non possono personalizzare direttamente il codice di selezione della rete ma usare i flag in NetworkScore per trasmettere le informazioni richieste sulle reti.

Android 11

Per i dispositivi con Android 11 o versioni precedenti, Android esegue la selezione della rete basato su un numero intero semplice inviato dalle implementazioni di un agente di rete (NetworkAgent). Per ogni richiesta, Android seleziona la rete con il punteggio numerico più alto. in grado di soddisfare la richiesta. Questo punteggio numerico è composto dal numero intero inviato dall'agente di rete più bonus o penalità aggiuntivi concessi in base a numero di condizioni, ad esempio se la rete è convalidata o è una VPN. I singoli agenti di rete si sincronizzano tra loro in ordine per prendere decisioni in merito alle norme.

Se due reti possono gestire una determinata richiesta e hanno lo stesso punteggio numerico, non è definito.

lezione NetworkScore

La classe centrale per la funzionalità di selezione della rete è NetworkScore. Questa classe contiene l'API e la documentazione dei flag e setKeepConnectedReason .

La classe NetworkScore deve essere creata tramite la relativa classe di builder ed essere passata al costruttore NetworkAgent all'inizializzazione. I punteggi della rete possono essere aggiornati in qualsiasi momento utilizzando il metodo NetworkAgent#sendNetworkScore.

Esempi di implementazione degli agenti di rete

AOSP include implementazioni di esempio di vari agenti di rete. Di seguito sono riportati alcuni esempi di implementazione:

  • TelephonyNetworkAgent: Utilizza il punteggio di rete per comunicare i criteri per le reti mobili
  • ClientModeImpl.WifiNetworkAgent: Utilizza il punteggio di rete per comunicare i criteri relativi alle reti Wi-Fi. Questa implementazione include la compatibilità con le versioni precedenti per il valore intero del punteggio della rete utilizzando il flag POLICY_EXITING.

Dispositivi di cui è stato eseguito l'upgrade ad Android 12

I produttori di dispositivi che eseguono l'upgrade dei propri dispositivi ad Android 12 devono modificare le implementazioni dell'agente di rete per utilizzare la classe NetworkScore. Il numero intero precedente utilizzato in Android 11 o versioni precedenti viene passato in NetworkScore, ma viene utilizzato solo per la registrazione e per scopi non di regressione in Android 12. In Android 12, i produttori di dispositivi devono indicare le modifiche desiderate usando i flag NetworkScore. Il modulo Connettività di Mainline utilizza quindi i flag per decidere la rete. I produttori di dispositivi che utilizzano codice per Android 11 o versioni precedenti, ma eseguono la compilazione in base all'implementazione in Android 12, possono aspettarsi errori di compilazione poiché i metodi per aggiornare l'intero precedente sono stati rimossi in Android 12.

Per gli agenti di rete che utilizzano la classe interna NetworkFactory , devono esprimere il filtro dei punteggi in un oggetto NetworkScore rappresentante il punteggio più alto di una rete che la factory può creare. Questo è perché in Android 12 solo la classe NetworkFactory passa le richieste che corrispondono ai filtri del punteggio dichiarati a NetworkFactory anziché tutte le richieste in Android 11 e versioni precedenti.

Consigliamo di inserire un filtro per semplificare l'implementazione e risparmiare batteria in modo che che non tutte le richieste vengano passate a NetworkFactory. Tuttavia, se la tua implementazione personalizzata richiede che tutte le richieste vengano passate a NetworkFactory, puoi registrare NetworkFactory.registerIgnoringScore anziché il metodo NetworkFactory.register normale. Se utilizzi questo metodo, ti consigliamo di passare un filtro del punteggio che rappresenta in modo più preciso il punteggio migliore che la fabbrica può creare per Risparmiare batteria evitando di valutare le richieste che la fabbrica non riesce a soddisfare.

Convalida

Per verificare il comportamento della selezione della rete su un dispositivo Android, utilizza la seguenti test:

Un'implementazione errata potrebbe comportare il ritorno di reti impreviste alle app in risposta al loro utilizzo di NetworkCallback, inclusa la selezione della rete predefinita del dispositivo (la rete inviata dal sistema all'app quando utilizza un callback di rete con ConnectivityManager.registerDefaultNetworkCallback).

Un altro possibile problema con un'implementazione errata è il consumo eccessivo della batteria. causata da un agente di rete visualizzato con un punteggio che non consente per qualsiasi richiesta e verranno rimossi immediatamente dopo. Se l'agente viene attivato e disattivato ripetutamente, potrebbe consumare molta batteria.