Selezione rete

Questa pagina descrive in che modo Android seleziona 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 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 selezionare 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 mezzo di trasporto, Android preferisce una rete con il flag 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 tipico esempio è quando la qualità di una rete Wi-Fi peggiora quando un utente esce dall'area di copertura 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 soddisfacendo la richiesta. Se nessuna rete pubblica la richiesta, ne viene scelta una delle due, che poi continuerà a essere preferita fino a quando i flag dei criteri non cambieranno.

L'implementazione della funzionalità di selezione della rete si trova nel modulo Connettività in AOSP. La logica del criterio per la selezione della rete si trova nella NetworkRanker classe e nelle relative classi di supporto. Ciò significa che i produttori di dispositivi non possono personalizzare direttamente il codice di selezione della rete, ma devono utilizzare 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 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 tra loro per prendere decisioni relative alle norme.

Se due reti possono soddisfare una determinata richiesta e hanno lo stesso punteggio numerico, il comportamento è indefinito.

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 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 della 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 alcuni esempi di implementazione:

  • TelephonyNetworkAgent: utilizza il punteggio della rete per comunicare le norme per le reti mobili
  • 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 che 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.

Gli agenti di rete che utilizzano la classe interna NetworkFactory devono esprimere il proprio filtro dei punteggi in un oggetto NetworkScore che rappresenti il punteggio più alto di una rete che la factory 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 l'implementazione errata è un grave consumo della batteria causato dall'attivazione di un agente di rete con un punteggio che non gli consente di soddisfare i requisiti per nessuna richiesta e dal suo smantellamento immediato. Se l'agente viene attivato e disattivato ripetutamente, potrebbe consumare molta batteria.