Android 10 では Wi-Fi lock API が拡張され、遅延に左右されるアプリで Wi-Fi を低遅延モードに設定できます。低遅延モードは、次のすべての条件が満たされると開始されます。
- Wi-Fi が有効で、デバイスがインターネットに接続されている。
- アプリが作成、獲得した Wi-Fi ロックがフォアグラウンドで実行されている。
- 画面が ON になっている。
デバイスで低遅延モードをサポートするには、デバイス メーカーが WLAN ドライバとベンダー HAL を更新する必要があります。低遅延モードでは、省電力モード(IEEE 802.11 標準では Doze 状態とも呼ばれます)がフレームワークによって明示的に無効になります。ドライバレイヤとファームウェア レイヤのスキャンとローミングのパラメータを最適化すると、Wi-Fi の遅延をさらに低下できます。正確な最適化は実装によって異なります。
Android には、低レイテンシ モードとは別に高性能 Wi-Fi ロックモード(API レベル 12 で導入)があります。
実装
Wi-Fi 低遅延モードの機能をサポートするには、次の IWifiChip
関数を実装します。
AIDL HAL の場合:
int getFeatureSet()
void setLatencyMode(in LatencyMode mode)
HIDL HAL(1.3 以降)の場合:
getCapabilities_1_3() generates (WifiStatus status, bitfield<ChipCapabilityMask> capabilities)
setLatencyMode(LatencyMode mode) generates (WifiStatus status)
wifi_legacy_hal.cpp
に次の関数の実装例があります。
wifi_error wifi_get_supported_feature_set(wifi_interface_handle iface, feature_set *set)
wifi_error wifi_set_latency_mode(wifi_interface_handle handle, wifi_latency_mode mode)
低レイテンシ モードでは、Android フレームワークの WifiLockManager
によって省電力モードが明示的に無効になります。これをサポートするには、WLAN ドライバが NL80211 コマンド NL80211_CMD_SET_POWER_SAVE
をサポートして、省電力モードを有効または無効にする必要があります。Wi-Fi 省電力モードが無効になっている場合、Wi-Fi システムはアウェイク状態のままで、かつ最小の遅延でパケットを送受信する準備ができている必要があります。
機能を無効にする
低遅延モードの機能をオフにするには、capabilities & SET_LATENCY_MODE = 0
のように getFeatureSet()
(AIDL HAL)または getCapabilities_1_3()
(HIDL HAL)の基盤となるコードを更新します(SET_LATENCY_MODE
は AIDL または HIDL の IWifiChip
で定義)。この機能を無効にすると、低遅延モードがアクティブのときにのみフレームワークが省電力モードになります。
検証
低遅延モードが有効になっていることをテストするには、次の自動テストと手動 ping 遅延テストを実行します。
自動テスト
次の VTS テストと CTS テストを実行します。
- VTS(AIDL):
hardware/interfaces/wifi/aidl/vts/functional/wifi_chip_aidl_test.cpp
- VTS(HIDL):
hardware/interfaces/wifi/1.3/vts/functional/wifi_chip_hidl_test.cpp
- CTS:
cts/tests/tests/net/src/android/net/wifi/cts/WifiLockTest.java
手動テスト
必要なテスト装置と環境
手動テストの場合は、次の設定が必要です。
- Wi-Fi アクセス ポイント(AP)
Device-Under-Test(DUT)の電話機とテスト用パソコン
- DUT は、Wi-Fi 経由でアクセス ポイントに接続する必要があります。
- テスト用パソコンは、Wi-Fi またはイーサネット経由でアクセス ポイントに接続する必要があります。
- テスト用パソコンは、USB 経由で DUT に接続する必要があります。
アップリンク ping テスト
低遅延モードを有効にします。
adb root
adb shell cmd wifi force-low-latency-mode enabled
パソコンが ADB 経由でスマートフォンに接続されていることを確認します。ADB シェルから、1 秒間隔で 3 時間連続でゲートウェイに ping します。
テストの出力をテキスト ファイルに保存し、スプレッドシートや Python スクリプトを使用して ping 遅延テスト結果のヒストグラムを生成します。
遅延モードを無効にして、ステップ 1~3 を繰り返します。
adb root
adb shell cmd wifi force-low-latency-mode disabled
テスト結果を比較して、低遅延モードが有効なときに ping の遅延の平均値が小さくなるようにします。
ダウンリンク ping テスト
低遅延モードを有効にします。
adb root
adb shell cmd wifi force-low-latency-mode enabled
テスト用パソコンのコマンドラインから、3 時間連続で 1 秒ごとにスマートフォンの IP アドレスに ping します。
テストの出力をテキスト ファイルに保存し、スプレッドシートや Python スクリプトを使用して ping 遅延テスト結果のヒストグラムを生成します。
遅延モードを無効にして、ステップ 1~3 を繰り返します。
adb root
adb shell cmd wifi force-low-latency-mode disabled
テスト結果を比較して、低遅延モードが有効なときに ping の遅延の平均値が小さくなるようにします。
その他のテスト
前述のテストを別の環境で繰り返します。たとえば、自宅や職場などでテストを行います。