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. Questa classe contiene una serie di indicatori necessari per prendere decisioni relative alle norme. Ogni flag rappresenta semanticamente un attributo 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 la bandiera POLICY_TRANSPORT_PRIMARY rispetto a una rete senza il flag.

Un agente di rete utilizza il flag POLICY_EXITING per identificare una rete che dovrebbe disconnettersi a breve. Un esempio tipico è quando la qualità di una rete Wi-Fi peggiora quando un utente esce dal raggio d'azione 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 peggiora a sufficienza da essere considerata in uscita.

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 flag è utile per le reti potenziali in quanto consente a un agente di rete di attivare una rete su un'unità di accesso in modalità wireless secondaria senza impostarla come rete principale finché non viene valutato il suo rendimento. Se un agente di rete non dichiara questo flag, le potenziali reti vengono rimosse per non aver soddisfatto alcuna richiesta prima che l'agente abbia la possibilità di valutare il rendimento di una rete.

Se due emittenti possono soddisfare una determinata richiesta e sono equivalenti dal punto di vista delle norme, la selezione preferisce la rete che sta attualmente pubblicando la richiesta. Se nessuna rete gestisce la richiesta, ne sceglie una delle due, dopodiché questa rete continua a essere preferita fino alla modifica dei flag dei criteri.

L'implementazione della funzionalità di selezione della rete si trova nel modulo Connettività in AOSP. La logica dei criteri per la selezione della rete si trova nella classe NetworkRanker e nelle relative classi helper. Ciò significa che i produttori di dispositivi non possono personalizzare direttamente il codice di selezione della rete, ma devono utilizzare i flag 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 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 dall'intero inviato dall'agente di rete più bonus o penalità aggiuntivi assegnati in base a una serie di condizioni, ad esempio se la rete è convalidata o se si tratta di una VPN. I singoli agenti di rete si sincronizzano per prendere decisioni sui criteri.

Se due reti possono soddisfare una determinata richiesta e hanno lo stesso punteggio numerico, il comportamento 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 disponibili e del metodo setKeepConnectedReason.

La classe NetworkScore deve essere creata tramite la relativa classe di builder ed essere passata al costruttore NetworkAgent all'inizializzazione. I punteggi di 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 della rete per comunicare i criteri per le reti mobile
  • ClientModeImpl.WifiNetworkAgent: utilizza il punteggio della rete per comunicare le norme per le 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 esprimere le modifiche auspicate utilizzando i flag NetworkScore. Il modulo Connectivity Mainline utilizza quindi i flag per prendere la decisione di selezione della 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 NetworkFactory interna, devono esprimere il filtro del punteggio in un oggetto NetworkScore che rappresenta il punteggio più alto di una rete che la fabbrica può creare. Questo accade perché in Android 12 la classe NetworkFactory passa solo le richieste che corrispondono ai filtri dei punteggi dichiarati a NetworkFactory, anziché a tutte le richieste in Android 11 e versioni precedenti.

Ti consigliamo di passare un filtro per un'implementazione più semplice e per risparmiare 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 anziché il metodo NetworkFactory.register normale. Se utilizzi questo metodo, ti consigliamo di passare un filtro per punteggio che representi con la massima precisione il punteggio migliore che la fabbrica può creare per risparmiare batteria non valutando le richieste che la fabbrica non può soddisfare.

Convalida

Per verificare il comportamento della selezione della rete su un dispositivo Android, utilizza i 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 non corretta è il grave consumo eccessivo della batteria, causato da un agente di rete che viene visualizzato con un punteggio che non lo rende idoneo per qualsiasi richiesta e viene rimosso immediatamente dopo. Se l'agente viene attivato e disattivato ripetutamente, potrebbe consumare molta batteria.