Selezione della rete

Questa pagina descrive il modo in cui Android seleziona tra le 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 influenza il modo in cui viene scelta la 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.

Androide 12

Per i dispositivi che eseguono Android 12 o versioni successive, Android usa la classe NetworkScore per selezionare tra le reti disponibili. Questa classe contiene una serie di flag necessari per prendere decisioni politiche. Ogni flag rappresenta semanticamente un attributo di una rete importante per la selezione della rete.

Un agente di rete ( NetworkAgent ) utilizza il flag POLICY_TRANSPORT_PRIMARY per specificare che la rete è preferita quando sono presenti più reti dello stesso trasporto. Un tipico esempio di ciò è un dispositivo dual-SIM con un interruttore in Impostazioni per consentire all'utente di scegliere quale delle carte SIM utilizzare per impostazione predefinita. All'interno di un dato trasporto, Android preferisce una rete con il flag POLICY_TRANSPORT_PRIMARY rispetto a una rete senza flag.

Un agente di rete utilizza il flag POLICY_EXITING per identificare una rete che si prevede si disconnetterà presto. Un tipico esempio di ciò è quando la qualità della rete Wi-Fi peggiora quando un utente esce dalla portata della rete. Android evita di utilizzare una rete con questo flag se è disponibile un'altra rete senza questo flag. Ogni singolo agente di rete può determinare quando una rete si degrada abbastanza da essere considerata in uscita.

La classe NetworkScore consente inoltre a un agente di rete di dichiarare che una rete verrà mantenuta attiva utilizzando il flag KEEP_CONNECTED_FOR_HANDOVER e il metodo NetworkScore.Builder.setKeepConnectedReason . Questo flag KEEP_CONNECTED_FOR_HANDOVER è utile per le reti potenziali che consentono a un agente di rete di attivare una rete su una STA Wi-Fi secondaria senza renderla la rete primaria finché non vengono valutate le prestazioni della rete. Se un agente di rete non dichiara questo flag, le potenziali reti vengono eliminate per non aver soddisfatto alcuna richiesta prima che l'agente abbia la possibilità di valutare le prestazioni di una rete.

Se due reti possono soddisfare una determinata richiesta e sono equivalenti dal punto di vista politico, la selezione preferisce la rete che attualmente soddisfa la richiesta. Se nessuna rete soddisfa la richiesta, ne sceglie una delle due, dopodiché questa rete continua ad essere preferita finché i flag dei criteri non cambiano.

L'implementazione della funzionalità di selezione della rete si trova nel modulo Connettività in AOSP. La logica della politica per la selezione della rete si trova nella classe NetworkRanker e nelle sue classi helper. Ciò significa che i produttori di dispositivi non possono personalizzare direttamente il codice di selezione della rete ma devono invece utilizzare i flag in NetworkScore per trasmettere le informazioni richieste sulle reti.

Androide 11

Per i dispositivi con Android 11 o versioni precedenti, Android esegue la selezione della rete in base a un semplice numero intero 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 dati in base a una serie di condizioni, ad esempio se la rete è convalidata o se la rete è una VPN. I singoli agenti di rete si sincronizzano tra loro per prendere decisioni politiche.

Se due reti possono servire una determinata richiesta e avere lo stesso punteggio numerico, il comportamento non è definito.

Classe NetworkScore

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

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

Esempi di implementazione dell'agente di rete

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

  • 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 per le reti Wi-Fi. Questa implementazione include la compatibilità con le versioni precedenti con il numero intero legacy per il punteggio di rete utilizzando il flag POLICY_EXITING .

Dispositivi che si aggiornano ad Android 12

I produttori di dispositivi che aggiornano i propri dispositivi ad Android 12 devono modificare le implementazioni dell'agente di rete per utilizzare la classe NetworkScore . Il numero intero legacy utilizzato in Android 11 o versioni precedenti viene passato in NetworkScore ma viene utilizzato solo per scopi di registrazione e non regressione in Android 12. In Android 12, i produttori di dispositivi devono esprimere le modifiche desiderate utilizzando i flag NetworkScore . Il modulo Connectivity Mainline utilizza quindi i flag per prendere la decisione sulla selezione della rete. I produttori di dispositivi che utilizzano codice per Android 11 o versioni precedenti ma si basano sull'implementazione in Android 12 possono aspettarsi errori di compilazione poiché i metodi per aggiornare l'intero legacy sono stati rimossi in Android 12.

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

Consigliamo di passare un filtro per un'implementazione più semplice e un risparmio della batteria in modo 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 invece del normale metodo NetworkFactory.register . Se si utilizza questo metodo, si consiglia di passare un filtro di punteggio che rappresenti in modo più accurato il miglior punteggio che la fabbrica può creare per risparmiare batteria evitando di valutare le richieste che la fabbrica non può soddisfare.

Validazione

Per verificare il comportamento della selezione della rete su un dispositivo Android, utilizzare i seguenti test:

Un'implementazione errata potrebbe comportare la restituzione di reti impreviste alle app in risposta all'utilizzo di NetworkCallback , inclusa la selezione della rete predefinita del dispositivo (la rete che il sistema invia all'app quando utilizza una richiamata di rete con ConnectivityManager.registerDefaultNetworkCallback ).

Un altro possibile problema con un'implementazione errata è il grave consumo della batteria causato da un agente di rete che viene generato con un punteggio che non gli consente di qualificarsi per qualsiasi richiesta e viene eliminato immediatamente dopo. Se l'agente viene sollevato e abbattuto ripetutamente, potrebbe consumare molta batteria.