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 mobiliClientModeImpl.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 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 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:
NetworkScoreTest
Test CTSNetworkRanker
test delle 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 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.