Wi-Fi

Il modulo Wi-Fi è aggiornabile, il che significa che può ricevere aggiornamenti alle funzionalità al di fuori del normale ciclo di rilascio di Android. Questo modulo contiene i seguenti componenti.

Componenti del modulo Wi-Fi

Figura 1. Componenti e architettura dei moduli Wi-Fi

Il modulo Wi-Fi offre i seguenti vantaggi.

  • Gli utenti finali usufruiscono di un'esperienza Wi-Fi coerente su tutti i dispositivi Android e vengono risolti i problemi di interoperabilità tramite gli aggiornamenti dei moduli.

  • Gli sviluppatori di app riducono la frammentazione della piattaforma.

  • Gli OEM possono soddisfare i requisiti degli operatori riducendo al contempo i costi per le singole personalizzazioni (poiché non hanno bisogno di implementazioni diverse degli stessi requisiti in modi diversi).

Confine del modulo per Android 12 e Android 13

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (file da frameworks/base/wifi/java)
      • tests/
        • android/net/wifi (file da frameworks/base/wifi/tests)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (file da frameworks/opt/net/wifi/service/java)
      • tests/
        • com/android/server/wifi (file da frameworks/opt/net/wifi/tests)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (file da frameworks/base/packages/OsuLogin)
    • ServiceResources/ (novità di Android 12, il manifest dell'APK dell'overlay è memorizzato qui)
      • res/ (novità di Android 11, configurazioni Wi-Fi estratte da frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (novità di Android 13: qui viene memorizzata l'app per avviare le finestre di dialogo con l'utente richieste dal servizio).
      • src/
        • com/android/wifi/dialog (contiene l'attività da cui vengono avviate le finestre di dialogo)
      • AndroidManifest.xml
      • Android.bp

Le directory precedenti contengono anche il codice che rimane al di fuori del componente di sistema modulare e nella sua posizione corrente, ad esempio:

  • wificond interface (classi nel pacchetto android.net.wifi.nl80211, ad esempio WifiNl80211Manager)
  • App di esempio per l'overlay delle risorse
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Gli OEM possono usare i comandi di esempio per spostare le patch dalle directory del progetto originali alla directory del nuovo progetto.

Spostare una patch da frameworks/base/wifi

Generare il file patch in root/frameworks/base/wifi

git format-patch -1 commit --stdout > patch-file.txt

Applicazione del file patch a root/packages/modules/Wifi

git am -p2 --directory=framework/ patch-file.txt

Spostare una patch da framework/opt/net/wifi

Per spostare la patch da frameworks/opt/net/wifi, sono necessari passaggi complessi perché la gerarchia delle directory è stata modificata durante la migrazione.

In frameworks/opt/net/wifi, suddividi il commit in due commit, uno per service/ e uno per tests/.

Migrazione del commit HEAD

git reset HEAD^
git add service/
git commit # Enter your commit message. Call this commit service-commit
git add tests/
git commit # Enter your commit message. Call this commit test-commit

Generazione di due file di patch di commit

git format-patch -1 service-commit --stdout > service-patch.txt
git format-patch -1 test-commit --stdout > test-patch.txt

Applicare le due patch a pacchetti/moduli/Wi-Fi

git am service-patch.txt
git am -p1 --directory=service/ test-patch.txt

Combinazione dei due commit in un unico commit

git rebase -i

Modifica l'operazione del secondo commit in squash.

Modifica il messaggio del commit in base alle esigenze.

Confine del modulo per Android 11

Il servizio Wi-Fi continua a funzionare all'interno del processo del servizio di sistema. Il modulo Wi-Fi include tutto il codice in packages/modules/Wifi, incluso quanto segue.

  • SDK e classi di servizio per WifiService, WifiP2pService, WifiAwareService, WifiScannerService e WifiRttService
  • OsuLogin
  • ServiceWifiResources

Il modulo esclude i seguenti componenti, che rimangono parte della build AOSP dell'OEM.

  • wificond componente nativo in system/connectivity/wificond
  • Interfaccia wificond (classi nel pacchetto android.net.wifi.nl80211, ad esempio WifiNl80211Manager)
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11 non sposta i file, ma le release future potrebbero farlo. Per ridurre lo sforzo necessario per eseguire il porting delle modifiche alla posizione dei file, consigliamo di eseguire il porting il maggior numero possibile di modifiche in AOSP (dopo averle eseguite su Android 11 o aver eseguito il refactoring delle estensioni proprietarie per utilizzare API Android formali o estensioni HAL del fornitore per slegarle dal codice AOSP.

Formato del modulo

Il modulo Wi-Fi (com.android.wifi) è in formato APEX ed è disponibile per i dispositivi con Android 11 o versioni successive. Il file APEX include i seguenti componenti.

  • Libreria SDK (framework-wifi.jar)
  • Libreria di servizi (service-wifi.jar)
  • APK OsuLogin (OsuLoginGoogle.apk)
  • APK della risorsa (ServiceWifiResourcesGoogle.apk)
  • Certificati WFA

Dipendenze del modulo

Il modulo Wi-Fi dipende dai seguenti componenti.

  • Connettività
  • Telefonia
  • Librerie proto
  • Vari componenti di sistema
  • HAL Wi-Fi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Questo modulo interagisce con il framework utilizzando solo @SystemApi stabile (nessun utilizzo dell'API @hide) ed è firmato con una firma di Google anziché con una firma della piattaforma.

Personalizzazione

Il modulo Wi-Fi non supporta la personalizzazione diretta, ma puoi personalizzare la configurazione utilizzando gli overlay delle risorse di runtime (RRO) o le configurazioni dell'operatore.

Personalizzazione del Wi-Fi

Figura 2. Personalizzazione del modulo Wi-Fi

  • Per piccole personalizzazioni, attiva o disattiva le impostazioni nell'RRO config.
  • Per un maggiore controllo, personalizza i valori di configurazione per qualsiasi chiave di configurazione dell'operatore esposto come @SystemAPI.

Utilizzare gli overlay delle risorse di runtime

Puoi personalizzare il modulo Wi-Fi eseguendo l'override delle configurazioni predefinite tramite gli RRO. Per un elenco delle configurazioni sovrapponibili, consulta packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml. Per i dettagli sul comportamento di configurazione, consulta packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml. Per un'app overlay di esempio, consulta device/google/coral/rro_overlays/WifiOverlay/.

Poiché il file device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml imposta l'attributo targetPackage su com.android.wifi.resources e l'APK della risorsa fornito dal modulo Wi-Fi ha il nome del pacchetto com.google.android.wifi.resources, devi impostare gli APK di overlay targetPackage su com.google.android.wifi.resources per sovrapporre correttamente le configurazioni Wi-Fi.

Esegui la migrazione del formato di archiviazione della configurazione

Il modulo Wi-Fi può analizzare solo il formato di archiviazione della configurazione Wi-Fi AOSP. Se hai precedentemente modificato il formato di archiviazione della configurazione Wi-Fi (che include l'elenco di reti salvate dell'utente), devi convertirli nel formato AOSP quando esegui l'upgrade di un dispositivo a qualsiasi release di Android che includa il modulo Wi-Fi. Gli hook necessari per questa conversione si trovano nella classe android.net.wifi.WifiMigration.

Implementa la conversione del formato nei seguenti metodi.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Viene invocato dal modulo Wi-Fi per recuperare i contenuti dei file dello store condiviso Wi-Fi che sono stati convertiti in formato AOSP.

    • In precedenza (in Android 10), questi file erano memorizzati nella cartella /data/misc/wifi sul dispositivo.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Viene invocato dal modulo Wi-Fi per recuperare i contenuti dei file dello Store specifici per l'utente Wi-Fi che sono stati convertiti in formato AOSP.

    • Questi file erano precedentemente (in Android 10) archiviati nella cartella /data/misc_ce/<userId>/wifi del dispositivo.

Accedere alle API Wi-Fi nascoste

I simboli (classi, metodi, campi e così via) annotati con @hide nel modulo Wi-Fi non fanno parte della sua area API pubblica e non sono accessibili sui dispositivi su cui è installato il modulo. I dispositivi che non includono il modulo Wi-Fi possono continuare a utilizzare le API Wi-Fi di @hide svolgendo i passaggi che seguono.

  1. Rimuovi le limitazioni di visibilità impostate su framework-wifi all'indirizzo packages/modules/Wifi/framework/Android.bp modificando l'attributo impl_library_visibility in pubblico.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Modifica la regola di build per consentire l'accesso alla libreria di API Wi-Fi di @hide. Ad esempio, di seguito è riportata una regola di compilazione per un java_library.

    java_library {
        name: "foo-lib",
    
        // no sdk_version attribute defined
    
        libs: [
            "dependency1",
            "dependency2",
        ],
    }
    

    Per consentire l'accesso alla libreria per foo-lib, modifica la regola di compilazione come segue:

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. Assicurati che framework-wifi.impl venga visualizzato prima di framework nell'elenco di libs. L'ordine delle dipendenze nell'attributo libs è significativo.

Accedi alle API del framework nascoste

I simboli annotati con @hide al di fuori del modulo Wi-Fi non sono accessibili al codice all'interno del modulo Wi-Fi. I dispositivi che non includono il modulo Wi-Fi possono continuare a utilizzare le API esterne di @hide (ad esempio, da framework.jar) in service-wifi apportando le seguenti modifiche a frameworks/opt/net/wifi/service/Android.bp.

  1. In entrambi wifi-service-pre-jarjar e service-wifi, modifica l'attributo sdk_version in core_platform.

  2. In entrambi wifi-service-pre-jarjar e service-wifi, aggiungi framework e android_system_server_stubs_current all'attributo libs.

  3. Verifica che il risultato sia simile al seguente esempio di codice.

    java_library {
        name: "wifi-service-pre-jarjar",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    ...
    java_library {
        name: "service-wifi",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    

Test

La Android Compatibility Test Suite (CTS) verifica le capacità del modulo Wi-Fi eseguendo una serie completa di test CTS per ogni release del modulo. Puoi anche eseguire i test descritti in Testare, eseguire il debug e ottimizzare il Wi-Fi.