Wi-Fi

Le module Wi-Fi est mis à jour, ce qui signifie qu'il peut recevoir des mises à jour de fonctionnalités en dehors du cycle de publication normal d'Android. Ce module contient les composants suivants.

Composants du module Wi-Fi

Figure 1 : Composants et architecture du module Wi-Fi

Le module Wi-Fi offre les avantages suivants.

  • Les utilisateurs finaux bénéficient d'une expérience Wi-Fi cohérente sur les appareils Android et de solutions aux problèmes d'interopérabilité grâce aux mises à jour des modules.

  • Les développeurs d'applications bénéficient d'une fragmentation de plate-forme réduite.

  • Les OEM peuvent répondre aux exigences des opérateurs tout en réduisant les coûts de personnalisation individuelle (car ils n'ont pas besoin d'implémentations différentes des mêmes exigences de différentes manières).

Limite de module pour Android 12 et Android 13

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (fichiers de frameworks/base/wifi/java)
      • tests/
        • android/net/wifi (fichiers de frameworks/base/wifi/tests)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (fichiers de frameworks/opt/net/wifi/service/java)
      • tests/
        • com/android/server/wifi (fichiers de frameworks/opt/net/wifi/tests)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (fichiers de frameworks/base/packages/OsuLogin)
    • ServiceResources/ (nouveau dans Android 12, le fichier manifeste APK de superposition est stocké ici)
      • res/ (nouveau dans Android 11, les configurations Wi-Fi sont extraites de frameworks/base/core/res/res)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (une nouveauté de l'application Android 13 permettant de lancer les boîtes de dialogue utilisateur demandées par le service est stockée ici.)
      • src/
        • com/android/wifi/dialog (contient l'activité à partir de laquelle les boîtes de dialogue sont lancées)
      • AndroidManifest.xml
      • Android.bp

Les répertoires précédents contiennent également du code qui reste en dehors du composant système modulaire et à son emplacement actuel, par exemple:

  • wificond interface (classes du package android.net.wifi.nl80211, par exemple WifiNl80211Manager)
  • Exemple d'application de superposition de ressources
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Les OEM peuvent utiliser les exemples de commandes pour déplacer leurs correctifs des répertoires de projet d'origine vers le nouveau répertoire de projet.

Déplacer un correctif depuis frameworks/base/wifi

Générer le fichier de correctif dans root/frameworks/base/wifi

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

Appliquer le fichier correctif à root/packages/modules/Wifi

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

Déplacer un correctif depuis frameworks/opt/net/wifi

Pour déplacer le correctif depuis frameworks/opt/net/wifi, des étapes complexes sont nécessaires, car la hiérarchie des répertoires a été modifiée lors de la migration.

Dans frameworks/opt/net/wifi, divisez le commit en deux commits, l'un pour service/ et l'autre pour tests/.

Migrer le 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

Générer deux fichiers de correctifs de commit

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

Application des deux correctifs à packages/modules/Wifi

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

Réunir les deux commits en un seul

git rebase -i

Remplacez l'opération du deuxième commit par squash.

Modifiez le message de commit si nécessaire.

Limite de module pour Android 11

Le service Wi-Fi continue de fonctionner dans le processus du service système. Le module Wi-Fi inclut tout le code de packages/modules/Wifi, y compris les éléments suivants.

  • SDK et classes de service pour WifiService, WifiP2pService, WifiAwareService, WifiScannerService et WifiRttService
  • OsuLogin
  • ServiceWifiResources

Le module exclut les composants suivants, qui font toujours partie du build AOSP de l'OEM.

  • wificond composant natif dans system/connectivity/wificond
  • Interface wificond (classes du package android.net.wifi.nl80211, par exemple WifiNl80211Manager)
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11 ne déplace pas les fichiers, mais les futures versions le feront peut-être. Pour réduire l'effort impliqué dans le portage des modifications de l'emplacement des fichiers, nous recommandons d'apporter autant de modifications que possible à l'AOSP en amont (après les avoir portées vers Android 11 ou refactorisées pour utiliser des API Android officielles ou des extensions HAL du fournisseur afin de les dissocier du code AOSP).

Format du module

Le module Wi-Fi (com.android.wifi) est au format APEX et est disponible pour les appareils exécutant Android 11 ou version ultérieure. Le fichier APEX comprend les composants suivants.

  • Bibliothèque SDK (framework-wifi.jar)
  • Bibliothèque de services (service-wifi.jar)
  • APK OsuLogin (OsuLoginGoogle.apk)
  • APK de ressources (ServiceWifiResourcesGoogle.apk)
  • Certificats WFA

Dépendances de module

Le module Wi-Fi dépend des composants suivants.

  • Connectivité
  • Téléphonie
  • Bibliothèques Proto
  • Composants divers du système
  • HAL Wi-Fi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Ce module interagit avec le framework à l'aide d'un @SystemApi stable uniquement (aucune utilisation de l'API @hide) et il est signé avec une signature Google au lieu d'une signature de plate-forme.

Personnalisation

Le module Wi-Fi n'est pas compatible avec la personnalisation directe, mais vous pouvez personnaliser la configuration à l'aide de superpositions de ressources d'exécution (RRO) ou de configurations de l'opérateur.

Personnalisation du Wi-Fi

Figure 2. Personnalisation du module Wi-Fi

  • Pour effectuer de petites personnalisations, activez ou désactivez les paramètres dans le config RRO.
  • Pour plus de contrôle, personnalisez les valeurs de configuration pour toute clé de configuration de l'opérateur exposée en tant que @SystemAPI.

Utiliser des superpositions de ressources d'exécution

Vous pouvez personnaliser le module Wi-Fi en remplaçant les configurations par défaut à l'aide de RRO. Pour obtenir la liste des configurations superposées, consultez packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml. Pour en savoir plus sur le comportement de configuration, consultez packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml. Pour obtenir un exemple d'application de superposition, consultez device/google/coral/rro_overlays/WifiOverlay/.

Étant donné que le fichier device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml définit l'attribut targetPackage sur com.android.wifi.resources et que l'APK de ressources fourni par le module Wi-Fi porte le nom de package com.google.android.wifi.resources, vous devez définir l'APK de superposition targetPackage sur com.google.android.wifi.resources pour superposer les configurations Wi-Fi.

Migrer le format de stockage de la configuration

Le module Wi-Fi ne peut analyser que le format de stockage de la configuration Wi-Fi AOSP. Si vous avez déjà modifié le format de stockage de la configuration Wi-Fi (qui inclut la liste de réseaux enregistrés de l'utilisateur), vous devez convertir ces données au format AOSP lorsque vous mettez à niveau un appareil vers une version Android incluant le module Wi-Fi. Les hooks nécessaires à cette conversion se trouvent dans la classe android.net.wifi.WifiMigration.

Implémentez la conversion de format dans les méthodes suivantes.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Appelé par le module Wi-Fi pour récupérer le contenu des fichiers du magasin partagé Wi-Fi qui ont été convertis au format AOSP.

    • Ces fichiers étaient auparavant (sous Android 10) stockés dans le dossier /data/misc/wifi sur l'appareil.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Appelé par le module Wi-Fi pour récupérer le contenu des fichiers de magasin spécifiques à l'utilisateur Wi-Fi qui ont été convertis au format AOSP.

    • Ces fichiers étaient auparavant (sous Android 10) stockés dans le dossier /data/misc_ce/<userId>/wifi de l'appareil.

Accéder aux API Wi-Fi masquées

Les symboles (classes, méthodes, champs, etc.) annotés avec @hide dans le module Wi-Fi ne font pas partie de sa surface d'API publique et ne sont pas accessibles sur les appareils sur lesquels le module est installé. Les appareils qui n'incluent pas de module Wi-Fi peuvent continuer à utiliser les API Wi-Fi @hide en procédant comme suit.

  1. Supprimez les restrictions de visibilité appliquées à framework-wifi à packages/modules/Wifi/framework/Android.bp en définissant l'attribut impl_library_visibility sur "public".

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. Modifiez la règle de compilation pour autoriser l'accès de la bibliothèque aux API Wi-Fi @hide. Par exemple, voici une règle de compilation pour un java_library.

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

    Pour autoriser l'accès à la bibliothèque pour foo-lib, modifiez la règle de compilation comme suit:

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. Assurez-vous que framework-wifi.impl apparaît avant framework dans la liste de libs. L'ordre des dépendances dans l'attribut libs est important.

Accéder aux API de framework masquées

Les symboles annotés avec @hide en dehors du module Wi-Fi ne sont pas accessibles par le code du module Wi-Fi. Les appareils qui n'incluent pas le module Wi-Fi peuvent continuer à utiliser les API externes @hide (par exemple, à partir de framework.jar) dans service-wifi en apportant les modifications suivantes à frameworks/opt/net/wifi/service/Android.bp.

  1. Dans les deux wifi-service-pre-jarjar et service-wifi, remplacez l'attribut sdk_version par core_platform.

  2. Dans les deux wifi-service-pre-jarjar et service-wifi, ajoutez framework et android_system_server_stubs_current à l'attribut libs.

  3. Vérifiez que le résultat ressemble à l'exemple de code suivant.

    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",
        ],
    }
    

Tests

La suite de tests de compatibilité Android (CTS) vérifie les fonctionnalités du module Wi-Fi en exécutant un ensemble complet de tests CTS sur chaque version du module. Vous pouvez également exécuter les tests décrits dans la section Tester, déboguer et régler le Wi-Fi.