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 del modulo Wi-Fi

Il modulo Wi-Fi offre i seguenti vantaggi.

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

  • Gli sviluppatori di app ottengono una frammentazione ridotta della piattaforma.

  • Gli OEM possono soddisfare i requisiti del vettore riducendo al tempo stesso i costi per le personalizzazioni individuali (poiché non necessitano di implementazioni diverse degli stessi requisiti in modi diversi).

Confini 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à in Android 12, il manifest dell'APK overlay è archiviato qui)
      • res/ (novità in Android 11, configurazioni Wi-Fi estratte da frameworks/base/core/res/res )
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (la novità dell'app Android 13 per avviare le finestre di dialogo utente richieste dal servizio è archiviata qui.)
      • src/
        • com/android/wifi/dialog (contiene l'attività da cui vengono avviate le finestre di dialogo)
      • AndroidManifest.xml
      • Android.bp

Le directory di cui sopra contengono anche codice che rimane all'esterno del componente del sistema modulare e nella sua posizione attuale, ad esempio:

  • wificond interface (classi nel pacchetto android.net.wifi.nl80211 , ad esempio WifiNl80211Manager )
  • Applicazione di esempio per la sovrapposizione delle risorse
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Gli OEM possono utilizzare i comandi di esempio per spostare le patch dalle directory del progetto originale alla nuova directory del progetto.

Spostamento di una patch da framework/base/wifi

Generazione del file di 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

Spostamento di una patch da frameworks/opt/net/wifi

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

In frameworks/opt/net/wifi , dividere 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

Applicazione delle due patch a pacchetti/moduli/Wifi

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

Ricomporre i due commit in un unico commit

git rebase -i

Cambia l'operazione del secondo commit in squash .

Modifica il messaggio di commit come appropriato.

Confini del modulo per Android 11

Il servizio Wi-Fi continua a essere eseguito all'interno del processo 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.

  • Componente nativo wificond nel 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 versioni future potrebbero farlo. Per ridurre lo sforzo richiesto dal trasferimento delle modifiche alla posizione dei file, consigliamo di eseguire l'upstream del maggior numero possibile di modifiche su AOSP (dopo averle trasferite su Android 11 o aver effettuato il refactoring delle estensioni proprietarie per utilizzare API Android formali o estensioni HAL del fornitore per separarle dal codice AOSP.

Formato del modulo

Il modulo Wi-Fi ( com.android.wifi ) è in formato APEX ed è disponibile per 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 di OsuLogin ( OsuLoginGoogle.apk )
  • APK della risorsa ( ServiceWifiResourcesGoogle.apk )
  • Certificati WFA

Dipendenze del modulo

Il modulo Wi-Fi dipende dai seguenti componenti.

  • Connettività
  • Telefonia
  • Protobiblioteche
  • Componenti vari del sistema
  • HAL WiFi
  • 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 Wi-Fi

Figura 2. Personalizzazione del modulo Wi-Fi

  • Per piccole personalizzazioni, abilitare o disabilitare le impostazioni nella config RRO.
  • Per un maggiore controllo, personalizza i valori di configurazione per qualsiasi chiave di configurazione dell'operatore esposta come @SystemAPI .

Utilizzo degli overlay delle risorse di runtime

È possibile personalizzare il modulo Wi-Fi sovrascrivendo le configurazioni predefinite utilizzando gli RRO. Per un elenco delle configurazioni sovrapponibili, fare riferimento a packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml . Per i dettagli sul comportamento di configurazione, fare riferimento a packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml . Per un'applicazione overlay di esempio, fai riferimento a 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 l'APK di sovrapposizione targetPackage su com.google.android.wifi.resources per sovrapporre correttamente le configurazioni Wi-Fi.

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 delle reti salvate dell'utente), devi convertire tali dati nel formato AOSP quando aggiorni un dispositivo a qualsiasi versione Android che includa il modulo Wi-Fi. Gli hook necessari per questa conversione si trovano nella classe android.net.wifi.WifiMigration .

Implementare la conversione del formato nei seguenti metodi.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Richiamato dal modulo Wi-Fi per recuperare il contenuto del file dell'archivio condiviso Wi-Fi che è stato convertito in formato AOSP.

    • Questi file erano precedentemente (in Android 10) archiviati nella cartella /data/misc/wifi sul dispositivo.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Richiamato dal modulo Wi-Fi per recuperare il contenuto del file di archivio specifico dell'utente Wi-Fi che è stato convertito in formato AOSP.

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

Accesso alle API Wi-Fi nascoste

I simboli (classi, metodi, campi, ecc.) annotati con @hide nel modulo Wi-Fi non fanno parte della sua superficie API pubblica e non è possibile accedervi sui dispositivi con il modulo installato. I dispositivi che non includono il modulo Wi-Fi possono continuare a utilizzare le API Wi-Fi @hide seguendo i passaggi seguenti.

  1. Rimuovere le restrizioni di visibilità imposte su framework-wifi in packages/modules/Wifi/framework/Android.bp modificando l'attributo impl_library_visibility in public.

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

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

    Per consentire l'accesso alla libreria per foo-lib , modificare la regola di compilazione come mostrato di seguito.

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

Accesso alle API del framework nascosto

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

  1. Sia in wifi-service-pre-jarjar che service-wifi , modifica l'attributo sdk_version in core_platform .

  2. Sia in wifi-service-pre-jarjar che service-wifi , aggiungi framework e android_system_server_stubs_current all'attributo libs .

  3. Verificare 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

Android Compatibility Test Suite (CTS) verifica la funzionalità del modulo Wi-Fi eseguendo una serie completa di test CTS su ogni versione del modulo. Puoi anche eseguire i test descritti in Test, debug e ottimizzazione del Wi-Fi .