Selezione rete

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
  • NetworkRanker unit 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.