Wi-Fi 模塊是可更新的,這意味著它可以接收正常 Android 發布週期之外的功能更新。該模塊包含以下組件。
圖 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
中的所有代碼,包括以下內容。
-
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.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。
通過將
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
進行以下修改,繼續在service-wifi
中使用@hide
外部 API(例如,來自framework.jar
)。 frameworks/opt/net/wifi/service/Android.bp
。
在
wifi-service-pre-jarjar
和service-wifi
中,將sdk_version
屬性更改為core_platform
。在
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中描述的測試。