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 の新機能、オーバーレイ 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/
用の 2 つのコミットに分割します。
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
2 つのコミット パッチ ファイルの生成
git format-patch -1 service-commit --stdout > service-patch.txt
git format-patch -1 test-commit --stdout > test-patch.txt
packages/modules/Wifi への 2 つのパッチの適用
git am service-patch.txt
git am -p1 --directory=service/ test-patch.txt
2 つのコミットを 1 つのコミットに戻す
git rebase -i
2 番目のコミットの操作を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
) - WFA 証明書
モジュールの依存関係
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>)
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
属性を 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", ], }
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
から) を引き続き使用できます。 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 の調整 で説明されているテストを実行することもできます。