Wi-Fi 模組是可更新的,這意味著它可以在正常 Android 發布週期之外接收功能更新。此模組包含以下組件。
圖 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
中的所有程式碼,包括以下內容。
-
WifiService
、WifiP2pService
、WifiAwareService
、WifiScannerService
和WifiRttService
的 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。
透過將
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. ], ... }
更改建置規則以允許庫存取
@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", ], }
確保
framework-wifi.impl
出現在libs
列表中的framework
之前。libs
屬性中的依賴關係順序很重要。
存取隱藏的框架 API
Wi-Fi 模組外部以@hide
註解的符號無法透過 Wi-Fi 模組內的程式碼存取。不包含Wi-Fi模組的設備可以透過對frameworks/opt/net/wifi/service/Android.bp
在wifi
wifi-service-pre-jarjar
和service-wifi
中,將sdk_version
屬性變更為core_platform
。在wifi
wifi-service-pre-jarjar
和service-wifi
中,將framework
和android_system_server_stubs_current
新增至libs
屬性。驗證結果是否類似於以下程式碼範例。
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中所述的測試。