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 (包含對話方塊啟動來源的活動)
      • 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

將兩個修補程式套用至 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)
  • WFA 憑證

模組依附元件

Wi-Fi 模組會依附下列元件。

  • 連線能力
  • 電話通訊系統
  • Proto 程式庫
  • 其他系統元件
  • Wi-Fi HAL
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

這個模組只使用穩定版 @SystemApi (不使用 @hide API) 與架構互動,且使用 Google 簽章而非平台簽章進行簽署。

自訂

Wi-Fi 模組不支援直接自訂,但您可以使用執行階段資源覆蓋層 (RRO)或電信業者設定來自訂設定。

自訂 Wi-Fi

圖 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,因此您必須將覆疊 APK targetPackage 設為 com.google.android.wifi.resources,才能成功覆疊 Wi-Fi 設定。

遷移設定儲存格式

Wi-Fi 模組只能剖析 Android 開放原始碼計畫的 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.impllibs 清單中顯示在 framework 之前。libs 屬性中的依附元件順序相當重要。

存取隱藏的架構 API

在 Wi-Fi 模組外部以 @hide 標示的符號,無法由 Wi-Fi 模組中的程式碼存取。不含 Wi-Fi 模組的裝置可以透過對 frameworks/opt/net/wifi/service/Android.bp 進行以下修改,繼續在 service-wifi 中使用 @hide 外部 API (例如來自 framework.jar)。

  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 Compatibility Test Suite (CTS) 會針對每個模組版本執行一組完整的 CTS 測試,驗證 Wi-Fi 模組的功能。您也可以執行「測試、偵錯及調整 Wi-Fi 功能」一文中所述的測試。