弱い Wi-Fi に Android は戻ってこない
2026年 10月 23日 金曜日
執筆者: Jasveen Singh Sandral
これは 2026/10/23 の社内 LT で話した内容です。大越さんの 最近ハマったPixel Watchのネットワーク設定 の続きのつもりで書いています。
症状
電波の弱い場所で Wi-Fi が一度切れると、Pixel Watch(Android 16)が自動では再接続しませんでした。画面をつけると戻ることはありました。
LT の当日も試しました。電波の弱い場所に置いた時計は、13時17分に切れたあと2時間半戻らず、手に取って画面がついた3秒後に戻りました。
調べると、理由は2つありました。
理由1: 5 GHz は -77 dBm より弱いと自動ではつながらない
dumpsys wifi の ScoringParams という行に、接続に使うしきい値が出ています。
$ adb shell dumpsys wifi | grep ScoringParams
ScoringParams: rssi2=-83:-80:-73:-60,rssi5=-80:-77:-70:-57,rssi6=-80:-77:-70:-57,...周波数帯ごとにある4つの数字の2番目が、自動接続の候補にしてよい最低の強さです。2.4 GHz は -80 dBm、5 GHz は -77 dBm で、これより弱い AP は見えていても自動接続の候補になりません。いまつながっている AP は対象外なので、効いてくるのは一度切れたあとです。
この値は端末に組み込まれていて、設定では変えられません。昔は wifi_score_params という設定で変えられましたが、Android 11 からは読まれていません。実際に settings put global wifi_score_params ... を入れてみても、ScoringParams の値は変わりませんでした。
理由2: 画面が消えていると、前に見つけたチャンネルしか探さない
画面が消えている間は、PNO という省電力のスキャンで保存済みの Wi-Fi を探します。時計のログには、探しているチャンネルがそのまま出ます。
wificond: Pno scan started for frequencies: 2412, 2417, ... 2462, 5500, 56205 GHz は 5500 MHz と 5620 MHz、チャンネルでいうと 100 と 124 の2つだけでした。PNO は、保存済みの Wi-Fi が最近見つかったチャンネルだけを探します。AP が別のチャンネルに移ると、画面が消えている間は見つけられません。チャンネルの記録がないときに使うデフォルトのリストにも、DFS チャンネルは入っていません。また、Android 14 からは画面オフ中の20分ごとのフルスキャンもなくなりました。
試したこと: ルーターのチャンネルだけを変える
理由2を確かめるために、同じ場所、同じルーターで、5 GHz のチャンネルだけを変えて、時計(充電中)が戻るかを見ました。電波は強いまま(-30 dBm 前後)です。
| AP のチャンネル | 画面 | 再接続 |
|---|---|---|
| いつものチャンネル(124) | オフ | 5回中5回(71〜180秒) |
| 初めてのチャンネル(104・108・116) | オフ | 3回中0回(7分待っても) |
| 初めてのチャンネル(112) | オン | 1回中1回(75秒) |
戻らなかった3回は、ルーターのログにも接続の試みが1回もありませんでした。時計がその AP を見つけられていない、ということです。画面をつけると、すぐに1回、そのあと20秒・40秒・80秒…と間隔をあけてフルスキャンが走るので、初めてのチャンネルでも75秒で戻りました。
自分の端末で確かめる
# しきい値
adb shell dumpsys wifi | grep ScoringParams
# 今の RSSI とチャンネル
adb shell cmd wifi status | grep -oE 'RSSI: -?[0-9]+|Frequency: [0-9]+MHz'
# 画面オフで探しているチャンネル
adb logcat -s wificond | grep 'Pno scan'どうするか
電波の弱い場所では、OS の自動再接続には頼れません。
- AP を近くに置き、5 GHz の電波が -77 dBm を十分に上回るようにする(理由1)
- AP のチャンネルを DFS 以外に固定する(理由2)。DFS チャンネルは、レーダーを検知すると AP がチャンネルを移すことがあります
理由が2つあるので、片方だけでは足りません。
設定画面から手動で Wi-Fi を選んだときは、この -77 dBm の基準は使われません。ただ、同じ接続をアプリから行う API(WifiManager.connect)はシステム用です。古い enableNetwork も、Android 10 以降を対象にしたアプリからは使えません。
アプリから WifiNetworkSpecifier で接続をリクエストする方法にも、-77 dBm の基準はありません。ただし、つながるのは基本的にローカル通信用のネットワークで、インターネットには使えません。最初に時計で承認する操作も要ります。手元の実機では承認しなかったので、リクエストのたびに確認の画面が出るだけでした。承認は記憶されるので次からは確認なしでつながるはずですが、そこはまだ試していません。電波の弱い端末は、AP 側で接続を断られることもあります。
参考
AOSP は android16-qpr2-release(android-16.0.0_r4)で確認しました。
- しきい値: ScoringParams.java、WifiNetworkSelector.java の isSignalTooWeak
wifi_score_paramsが使われていないこと: Settings.java- 画面オフのスキャンのチャンネル(30日分の記録): WifiConnectivityManager.java、チャンネルの集め方
- Android 14 でなくなった20分ごとのフルスキャン: WifiConnectivityManager.java
- デフォルトのリストに DFS がないこと: wificond の scanner_impl.cpp
- 手で選んだときの接続: WifiManager.java の connect、ConnectHelper.java
- アプリからの接続: WifiNetworkSpecifier(Android Developers)、WifiNetworkFactory.java(基準なし)、承認の記憶