無線上網

Wi-Fi 模塊是可更新的,這意味著它可以接收正常 Android 發布週期之外的功能更新。該模塊包含以下組件。

Wi-Fi 模塊組件

圖 1. Wi-Fi 模塊組件和架構

Wi-Fi 模塊具有以下優點。

  • 最終用戶在 Android 設備上獲得一致的 Wi-Fi 體驗,並通過模塊更新修復互操作性問題。

  • 應用程序開發人員減少了平台碎片。

  • OEM 可以滿足運營商的要求,同時還可以降低個性化定制的成本(因為他們不需要以不同的方式對相同的要求進行不同的實施)。

Android 12 的模塊邊界

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi (來自frameworks/base/wifi/java的文件)
      • tests/
        • android/net/wifi (來自frameworks/base/wifi/tests的文件)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi (來自frameworks/opt/net/wifi/service/java的文件)
      • tests/
        • com/android/server/wifi (來自frameworks/opt/net/wifi/tests的文件)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/ (來自frameworks/base/packages/OsuLogin
    • ServiceResources/ (Android 12 新增,Overlay APK manifest 存儲在這裡)
      • res/ (Android 11 中的新功能,從frameworks/base/core/res/res中提取的 Wi-Fi 配置)
      • AndroidManifest.xml
      • Android.bp

上述目錄還包含保留在模塊化系統組件之外並位於其當前位置的代碼,例如:

  • wificond interface (包android.net.wifi.nl80211中的類,例如WifiNl80211Manager
  • 示例資源疊加應用
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

OEM 可以使用示例命令幫助將其補丁從原始項目目錄移動到新項目目錄。

從 frameworks/base/wifi 移動補丁

在 root/frameworks/base/wifi 中生成補丁文件

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

將補丁文件應用到 root/packages/modules/Wifi

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

從 frameworks/opt/net/wifi 移動補丁

要從frameworks/opt/net/wifi移動補丁,需要復雜的步驟,因為在遷移過程中目錄層次結構發生了變化。

frameworks/opt/net/wifi中,將提交拆分為兩個提交,一個用於service/ ,一個用於tests/

遷移 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

生成兩個提交補丁文件

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

將這兩個補丁應用到包/模塊/Wifi

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

將兩個提交壓縮回一個提交

git rebase -i

將第二次提交的操作更改為squash

根據需要編輯提交消息。

Android 11 的模塊邊界

Wi-Fi 服務繼續在系統服務進程中運行。 Wi-Fi 模塊包含packages/modules/Wifi中的所有代碼,包括以下內容。

  • WifiServiceWifiP2pServiceWifiAwareServiceWifiScannerServiceWifiRttService的 SDK 和服務類
  • OsuLogin
  • ServiceWifiResources

該模塊不包括以下組件,它們仍然是 OEM 的 AOSP 構建的一部分。

  • system/connectivity/wificond中的wificond本機組件
  • wificond接口(包android.net.wifi.nl80211中的類,例如WifiNl80211Manager
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11 不會移動文件,但未來的版本可能會。為了減少移植文件位置更改所涉及的工作量,我們建議在上游對 AOSP 進行盡可能多的更改(在將它們移植到 Android 11 或重構專有擴展以使用正式的 Android API 或供應商 HAL 擴展以將它們與 AOSP 代碼分離之後。

模塊格式

Wi-Fi 模塊 ( com.google.android.wifi.apex ) 採用APEX格式,可用於運行 Android 11 或更高版本的設備。 APEX 文件包括以下組件。

  • SDK 庫 ( framework-wifi.jar )
  • 服務庫 ( service-wifi.jar )
  • OsuLogin APK ( OsuLoginGoogle.apk )
  • 資源 APK ( ServiceWifiResourcesGoogle.apk )
  • WFA證書

模塊依賴

Wi-Fi 模塊依賴於以下組件。

  • 連接性
  • 電話
  • 原型庫
  • 雜項系統組件
  • WiFi HAL
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

該模塊僅使用穩定的@SystemApi (不使用@hide API)與框架交互,並使用谷歌簽名而不是平台簽名進行簽名。

定制

Wi-Fi 模塊不支持直接自定義,但您可以使用運行時資源覆蓋 (RRO)或運營商配置自定義配置。

無線網絡定制

圖 2. Wi-Fi 模塊定制

  • 對於小型自定義,啟用或禁用 RRO config中的設置。
  • 要獲得更多控制,請為公開為@SystemAPI的任何運營商配置鍵自定義配置值。

使用運行時資源覆蓋

您可以通過使用 RRO 覆蓋默認配置來自定義 Wi-Fi 模塊。有關可疊加配置的列表,請參閱packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml 。有關配置行為的詳細信息,請參閱packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml 。有關示例疊加應用程序,請參閱device/google/coral/rro_overlays/WifiOverlay/

因為device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml文件將targetPackage屬性設置為com.android.wifi.resources並且 Wi-Fi 模塊下發的資源 APK 包名為com.google.android.wifi.resources ,您必須將覆蓋的 APKS targetPackage設置為com.google.android.wifi.resources才能成功覆蓋 Wi-Fi 配置。

遷移配置存儲格式

Wi-Fi 模塊只能解析 AOSP Wi-Fi 配置存儲格式。如果您之前修改了 Wi-Fi 配置存儲格式(包括用戶保存的網絡列表),則在將設備升級到任何包含 Wi-Fi 模塊的 Android 版本時,必須將該數據轉換為 AOSP 格式。此轉換所需的掛鉤位於android.net.wifi.WifiMigration類中。

通過以下方法實現格式轉換。

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • 由 Wi-Fi 模塊調用,用於檢索已轉換為 AOSP 格式的 Wi-Fi 共享存儲文件內容。

    • 這些文件以前(在 Android 10 中)存儲在設備上的/data/misc/wifi文件夾中。

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • 由 Wi-Fi 模塊調用以檢索已轉換為 AOSP 格式的 Wi-Fi 用戶特定存儲文件內容。

    • 這些文件之前(在 Android 10 中)存儲在設備上的/data/misc_ce/<userId>/wifi文件夾中。

訪問隱藏的 Wi-Fi API

在 Wi-Fi 模塊中使用@hide註釋的符號(類、方法、字段等)不是其公共 API 表面的一部分,並且無法在安裝了該模塊的設備上訪問。不包含 Wi-Fi 模塊的設備可以通過以下步驟繼續使用@hide Wi-Fi API。

  1. 通過將impl_library_visibility屬性更改為 public,移除位於packages/modules/Wifi/framework/Android.bpframework-wifi的可見性限制。

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. 更改構建規則以允許庫訪問@hide Wi-Fi API。例如,以下是java_library的構建規則。

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

    要允許foo-lib的庫訪問,請更改構建規則,如下所示。

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. 確保framework-wifi.impl出現在libs列表中framework之前。 libs屬性中的依賴順序很重要。

訪問隱藏的框架 API

在 Wi-Fi 模塊外使用@hide註釋的符號不能被 Wi-Fi 模塊內的代碼訪問。不包含 Wi-Fi 模塊的設備可以通過對frameworks/opt/net/wifi/service/Android.bp進行以下修改,繼續在service-wifi中使用@hide外部 API(例如,來自framework.jar )。 frameworks/opt/net/wifi/service/Android.bp

  1. wifi-service-pre-jarjarservice-wifi中,將sdk_version屬性更改為core_platform

  2. wifi-service-pre-jarjarservice-wifi中,將frameworkandroid_system_server_stubs_current添加到libs屬性。

  3. 驗證結果是否類似於以下代碼示例。

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

測試

Android 兼容性測試套件 (CTS) 通過在每個模塊版本上運行一組全面的 CTS 測試來驗證 Wi-Fi 模塊的功能。您還可以運行測試、調試和調整 Wi-Fi中描述的測試。