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 mobiliClientModeImpl.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 flagPOLICY_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:
NetworkScoreTest
Test CTSNetworkRanker
test di unità
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.