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 低レイテンシ モードの機能は android.hardware.wifi@1.3
にあります。この機能をサポートするには、IWifiChip.hal
に次の関数を実装します。
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
のように getCapabilities_1_3()
の基盤となるコードを更新します(SET_LATENCY_MODE
は IWifiChip.hal
で定義)。この機能を無効にすると、低レイテンシ モードがアクティブのときにのみフレームワークが省電力モードになります。
検証
低レイテンシ モードが有効になっていることをテストするには、次の自動テストと手動 ping レイテンシ テストを実行します。
自動テスト
次の VTS テストと CTS テストを実行します。
- VTS:
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
テスト用パソコンのコマンドラインから、1 秒間隔で 3 時間連続でスマートフォンの IP アドレスに ping します。
テストの出力をテキスト ファイルに保存し、スプレッドシートや Python スクリプトを使用して ping レイテンシ テスト結果のヒストグラムを生成します。
レイテンシ モードを無効にして、ステップ 1~3 を繰り返します。
adb root
adb shell cmd wifi force-low-latency-mode disabled
テスト結果を比較して、低レイテンシ モードが有効なときに ping レイテンシの平均値が小さくなるようにします。
その他のテスト
前述のテストを別の環境で繰り返します。たとえば、自宅や職場などでテストを行います。