Questa pagina descrive come 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 sul modo in cui Android sceglie 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 (livello API 30) 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 flag che prendono decisioni relative alle norme. Ogni flag rappresenta un attributo
della rete importante per la selezione della rete.
Un agente di rete (NetworkAgent) utilizza il flag POLICY_TRANSPORT_PRIMARY
per specificare che Android preferisce la rete se sono presenti più reti dello
stesso trasporto. Ad esempio, un dispositivo dual SIM ha un'opzione in
Impostazioni che ti consente di scegliere quale scheda SIM utilizzare per impostazione predefinita. All'interno di un
determinato trasporto, Android preferisce una rete con il flag POLICY_TRANSPORT_PRIMARY
a una rete senza il flag.
Un agente di rete utilizza il flag POLICY_EXITING per identificare una rete che
dovrebbe disconnettersi. Ad esempio, la qualità della rete Wi-Fi peggiora se un utente
esce dal raggio d'azione della rete. Android evita di utilizzare una rete con questo flag
se è disponibile un'altra rete senza. Ogni agente di rete può determinare
quando una rete si degrada al punto da essere considerata in uscita.
La classe NetworkScore consente inoltre a un agente di rete di dichiarare che Android mantiene una
rete connessa utilizzando il flag KEEP_CONNECTED_FOR_HANDOVER e il
metodo NetworkScore.Builder.setKeepConnectedReason. Questo
flag KEEP_CONNECTED_FOR_HANDOVER aiuta le potenziali emittenti. Questo flag consente a un agente di rete di visualizzare una rete su una STA Wi-Fi secondaria senza renderla la rete principale finché Android non valuta le prestazioni della rete. Se un agente di rete
non dichiara questo flag, Android smantella le potenziali reti che non
servono alcuna richiesta prima che l'agente valuti il rendimento di una rete.
Se due reti possono soddisfare una determinata richiesta e hanno una policy equivalente, Android preferisce la rete che soddisfa la richiesta. Se nessuna rete gestisce la richiesta, Android ne sceglie una delle due. Questa rete continua a essere preferita finché non cambiano i flag delle norme.
La funzionalità di selezione della rete è implementata nel modulo di connettività in
Android Open Source Project (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. Devono invece
utilizzare i flag in NetworkScore per comunicare informazioni sulle emittenti.
Android 11
Per i dispositivi con Android 11 o versioni precedenti, Android esegue la selezione della rete
in base a un numero intero inviato da 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 numero inviato dall'agente di rete più eventuali bonus o penalità aggiuntivi. Android applica questi
bonus o penalità in base a condizioni, ad esempio se la rete è
convalidata o una VPN. Gli agenti di rete si sincronizzano tra loro per prendere decisioni
relative ai criteri.
Se due network possono pubblicare una determinata richiesta e hanno lo stesso punteggio numerico, il comportamento non è definito.
Classe NetworkScore
La classe NetworkScore è fondamentale per la funzionalità di selezione della rete. Questa classe
contiene l'API e la documentazione per i flag disponibili e il metodo
NetworkScore.Builder.setKeepConnectedReason.
Devi creare la classe NetworkScore utilizzando la relativa classe builder e passarla al
costruttore NetworkAgent durante l'inizializzazione. Puoi aggiornare
i punteggi di rete 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. L'elenco seguente fornisce implementazioni di esempio:
- TelephonyNetworkAgent: Utilizza il punteggio di rete per comunicare la policy per le reti mobili.
- ClientModeImpl.WifiNetworkAgent: utilizza il punteggio di rete per comunicare le norme per le reti Wi-Fi. Questa implementazione fornisce la compatibilità con l'intero legacy per il punteggio di rete utilizzando il flag- POLICY_EXITING.
Dispositivi che eseguono 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. L'intero legacy utilizzato in Android 11 o versioni precedenti viene
trasmesso in NetworkScore, ma viene utilizzato solo per la registrazione e per scopi
di non regressione in Android 12. In Android
12, i produttori di dispositivi devono esprimere le modifiche utilizzando
i flag NetworkScore. Il modulo Connectivity Mainline utilizza quindi i flag per
prendere decisioni sulla 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 riscontrare errori di compilazione perché i metodi per
aggiornare l'intero legacy sono stati rimossi in Android 12.
Per gli agenti di rete che utilizzano la classe interna NetworkFactory, devi
esprimere il filtro del punteggio in un oggetto NetworkScore che rappresenta il
punteggio più alto di una rete che la fabbrica può creare. Questo perché in Android
12, la classe NetworkFactory passa solo le richieste
che corrispondono ai filtri del punteggio dichiarati a NetworkFactory, a differenza di Android 11
e versioni precedenti, in cui passa tutte le richieste.
Puoi passare un filtro per semplificare l'implementazione e risparmiare batteria, il che garantisce
che NetworkFactory non elabori tutte le richieste. Tuttavia, se la tua implementazione personalizzata
richiede che tutte le richieste vengano trasmesse a NetworkFactory, puoi
registrare NetworkFactory.registerIgnoringScore anziché il metodo
NetworkFactory.register standard. Se utilizzi questo metodo, applica un filtro
del punteggio che rappresenti nel modo più accurato il miglior punteggio che la fabbrica può creare.
In questo modo si risparmia batteria evitando la valutazione delle richieste che la fabbrica non può
soddisfare.
Convalida
Per verificare il comportamento di selezione della rete su un dispositivo Android, utilizza i seguenti test:
- Test CTS NetworkScoreTest
- NetworkRankerunit test
Un'implementazione errata potrebbe comportare il ritorno di reti impreviste alle app
quando utilizzano NetworkCallback. Ciò include la selezione della rete predefinita del dispositivo (la rete che il sistema invia a un'app quando utilizza un callback di rete, ad esempio con ConnectivityManager.registerDefaultNetworkCallback).
Un altro possibile problema di implementazione errata è il consumo eccessivo della batteria. Ciò si verifica quando un agente di rete viene visualizzato con un punteggio che non gli consente di qualificarsi per qualsiasi richiesta e viene eliminato immediatamente dopo. Se l'agente viene visualizzato e chiuso ripetutamente, il consumo della batteria può essere significativo.
