Wi-Fi

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

Wi-Fi模組組件

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

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

  • 最終用戶可以在 Android 裝置上獲得一致的 Wi-Fi 體驗,並透過模組更新修復互通性問題。

  • 應用程式開發人員可以減少平台碎片。

  • OEM 可以滿足營運商的要求,同時還可以降低個人化客製化的成本(因為他們不需要以不同的方式實現相同的要求)。

Android 12 和 Android 13 的模組邊界

  • 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 清單儲存在此)
      • res/ (Android 11 中的新功能,從frameworks/base/core/res/res擷取 Wi-Fi 設定)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (Android 13 應用程式中用於啟動服務請求的使用者對話方塊的新功能儲存在此。)
      • src/
        • com/android/wifi/dialog (包含啟動對話方塊的 Activity)
      • AndroidManifest.xml
      • Android.bp

上述目錄也包含保留在模組化系統元件外部及其目前位置的程式碼,例如:

  • wificond interface (包android.net.wifi.nl80211中的類,例如WifiNl80211Manager
  • 範例資源覆蓋應用程式
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

OEM 可以使用範例命令來協助將其補丁從原始專案目錄移至新專案目錄。

從框架/基礎/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

將兩個補丁套用到packages/modules/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.android.wifi ) 採用APEX格式,適用於運行 Android 11 或更高版本的裝置。 APEX 檔案包含以下組件。

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

模組依賴

Wi-Fi 模組取決於以下組件。

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

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

客製化

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.bp中對framework-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

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

  2. wifi 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中所述的測試。