Wi-Fi モジュールは更新可能です。つまり、通常の Android リリース サイクル外で機能のアップデートを受信できます。このモジュールには、次のコンポーネントが含まれています。
図 1. Wi-Fi モジュールのコンポーネントとアーキテクチャ
Wi-Fi モジュールには次のような利点があります。
エンドユーザーが、Android デバイス全体で一貫した Wi-Fi エクスペリエンスを得られ、モジュール アップデートを通じて相互運用性の問題を修正できる。
アプリ デベロッパーがプラットフォームの断片化を削減できる。
OEM が、携帯通信会社の要件を完全に満たしつつ、個別のカスタマイズのコストを削減できる(同じ要件を異なる方法で実装する必要がないため)。
モジュールの境界
Wi-Fi サービスは、システム サービス プロセス内で実行され続けます。Wi-Fi モジュールには、下記を含め、frameworks/opt/net/wifi
と frameworks/base/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 モジュールは次のコンポーネントに依存します。
- 接続
- 電話
- proto ライブラリ
- その他のシステム コンポーネント
- Wi-Fi HAL
wificond
bouncycastle
ksoap2
libnanohttpd
このモジュールは、@hide
API は使用せず安定版の @SystemApi
のみを使用してフレームワークと通信し、プラットフォーム署名ではなく Google 署名で署名されます。
カスタマイズ
Wi-Fi モジュールは直接のカスタマイズをサポートしていませんが、ランタイム リソース オーバーレイ(RRO)または携帯通信会社の構成を使用して構成をカスタマイズできます。
図 2. Wi-Fi メインライン モジュールのカスタマイズ
- 小規模なカスタマイズの場合は、RRO
config
の設定を有効または無効にします。 - 詳細な制御を行うには、
@SystemAPI
として公開される携帯通信会社の構成キーの構成値をカスタマイズします。
ランタイム リソース オーバーレイの使用
RRO を使用してデフォルト構成をオーバーライドすることで、Wi-Fi モジュールをカスタマイズできます。オーバーレイ可能な構成のリストについては、frameworks/opt/net/wifi/service/res/values/overlayable.xml
をご覧ください。構成動作の詳細については、frameworks/opt/net/wifi/service/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 モジュールがパースできる Wi-Fi 構成ストレージ形式は、AOSP のみです。以前に Wi-Fi 構成ストレージ形式(ユーザーが保存したネットワーク リストを含む)を変更した場合は、Wi-Fi モジュールを含む Android リリースにデバイスをアップグレードする際、そのデータを AOSP 形式に変換する必要があります。この変換に必要なフックは android.net.wifi.WifiMigration
クラスにあります。
形式変換を実装するメソッドは次のとおりです。
WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)
AOSP 形式に変換された Wi-Fi 共有ストアファイルのコンテンツを取得するために Wi-Fi モジュールによって呼び出されます。
これらのファイルは、以前(Android 10 の場合)はデバイスの
/data/misc/wifi
フォルダに保存されていました。
WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)
AOSP 形式に変換された Wi-Fi ユーザー固有ストアファイルのコンテンツを取得するために 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
属性を削除することで、frameworks/base/wifi/Android.bp
のframework-wifi
に配置されていた公開設定に関する制限を削除します。java_sdk_library { name: "framework-wifi", ... impl_library_visibility: [ // delete this attribute ... ], ... }
ライブラリによる
@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", ], }
libs
のリストでframework
の前にframework-wifi.impl
が表示されていることを確認します。libs
属性内の依存関係の順序は重要です。
非表示のフレームワーク API へのアクセス
Wi-Fi モジュール外で @hide
アノテーションが付いたシンボルは、Wi-Fi モジュール内のコードではアクセスできません。Wi-Fi モジュールを含まないデバイスでは、frameworks/opt/net/wifi/service/Android.bp
に次の変更を行うことで、引き続き service-wifi
で @hide
外部 API(framework.jar
など)を使用できます。
wifi-service-pre-jarjar
とservice-wifi
の両方で、sdk_version
属性をcore_platform
に変更します。wifi-service-pre-jarjar
とservice-wifi
の両方で、libs
属性にframework
とandroid_system_server_stubs_current
を追加します。結果が次のコードサンプルのようになることを確認します。
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 のテスト、デバッグ、チューニングに記載されているテストも実行できます。