はじめに
Android Emulator 37.1.11(macOS / Apple Silicon)で Android TV の AVD を動かすと、起動から数分〜数十分でゲストのネットワークが落ち、エミュレータを再起動するまで戻らない問題が発生した。
同じ不具合が発生した場合の解決方法のメモ
アプリ側には通信エラーとして見える。原因はホスト側 netsimd の仮想 Wi-Fi。WiFiPacketStream = off で netsimd を Wi-Fi から外すことで不具合を修正できた。
環境
- macOS 26(Darwin 25.5.0)、Apple Silicon
- Android Emulator 37.1.11.0(netsim 0.3.114)
- AVD:
Television_1080p、system imageandroid-31/android-tv/arm64-v8a(buildSTT9.221129.002) - 起動:
emulator -avd Television_1080p -no-snapshot-load -dns-server 8.8.8.8 - 操作は Appium 3.4.2(UiAutomator2)
症状
アプリが通信エラーを出す。logcat の内容は下記の通り。
W DeviceStateUtils: Active network is null
E Finsky : ... net::ERR_INTERNET_DISCONNECTED, ErrorCode=2, InternalErrorCode=-106
ゲスト側は wlan0 にキャリアが無く、既定ネットワークも無い。
$ adb shell ip addr show wlan0
16: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN ...
$ adb shell dumpsys connectivity | grep 'Active default'
Active default network: none
ホスト側は 5 秒間隔の ping 8.8.8.8 が一度も落ちていない。
起動直後は正常で、NetworkMonitor の validation passed まで通る。落ちるまでの時間は、起動時刻が分かる 2 回で 70 秒と 23 分。もう 1 回は起動時刻が残っていない。
ゲスト側のログ
落ちた瞬間。タグは IpClient.wlan0 / DhcpClient / WifiClientModeImpl / WifiSelfRecovery。
W IpClient.wlan0: [IpReachabilityMonitor] WARN ALERT neighbor went from: ...,10.0.2.2,NUD_PROBE,... to: ...,NUD_FAILED,[null]
W IpReachabilityMonitor: FAILURE: LOST_PROVISIONING, NeighborEvent{...,if=16,10.0.2.2,NUD_FAILED,[null]}
D WifiClientModeImpl[wlan0]: CMD_START_CONNECT my state DisconnectedState nid=0 roam=false
D DhcpClient: Broadcasting DHCPREQUEST ciaddr=0.0.0.0 request=10.0.2.16 serverid=null
D DhcpClient: Broadcasting DHCPREQUEST ciaddr=0.0.0.0 request=10.0.2.16 serverid=null
D DhcpClient: Broadcasting DHCPREQUEST ciaddr=0.0.0.0 request=10.0.2.16 serverid=null
D DhcpClient: Broadcasting DHCPDISCOVER
D DhcpClient: Broadcasting DHCPDISCOVER
D DhcpClient: Broadcasting DHCPDISCOVER
D DhcpClient: Broadcasting DHCPDISCOVER
D WifiClientModeImpl[wlan0]: CMD_START_CONNECT my state DisconnectedState nid=0 roam=false
...(約 22 秒周期で繰り返し)
E WifiSelfRecovery: Triggering recovery for reason: Last Resort Watchdog
-
IpReachabilityMonitorはゲートウェイや DNS に ARP/NDP で生存確認する仕組み。NUD_FAILEDは応答なし。LOST_PROVISIONINGで Wi-Fi フレームワークが接続を捨てる。ゲートウェイ10.0.2.2(エミュレータ仮想ネットワークの固定アドレス)が応答していない。 - 再接続後の
DHCPREQUEST/DHCPDISCOVERに応答が無い。約 18 秒でタイムアウトし、reason_code=3(端末側から切断)で切って再接続。これで約 22 秒周期。 - 失敗が続くと
Last Resort Watchdogが Wi-Fi を再起動する。応答しないのはホスト側なので直らない。
ホスト側
Emulator 36.2.6 から、ゲストの Wi-Fi はエミュレータ本体ではなく別プロセスの netsimd(Bluetooth と Wi-Fi のパケットを扱うシミュレータ)が持つ。feature flag 名は WiFiPacketStream。emulator -verbose の起動ログ。
INFO | Successfully initialized netsim WiFi
INFO | argv[71] = "user,id=virtio-wifi,dhcpstart=10.0.2.16"
netsimd のログは $TMPDIR/android-$USER/netsimd/netsim_stderr.log(macOS の $TMPDIR は /var/folders/.../T/)。落ちている間、netsimd 内の hostapd にはゲストからの切断だけが並ぶ。
wlan1: deauthentication: STA=02:15:b2:00:00:00 reason_code=3
wlan1: AP-STA-DISCONNECTED 02:15:b2:00:00:00
同じ場所の netsim_session_stats.json は、落ちたセッション(5 分)で maxDownloadThroughput: 0.0、networkErrors: 0。802.11 の認証・アソシエーションは通り、その先の ARP 応答と DHCP 応答が netsimd から返っていない。netsimd 内部で何が止まっているかは不明。
修正に繋がらなかった対応策
- ゲスト内の Wi-Fi オン/オフ(
CMD_WIFI_TOGGLED): 再接続はするが DHCP が返らない。 -
-dns-server 8.8.8.8: 付けていても落ちた。DNS 以前にゲートウェイへの ARP が返っていない。 - Appium やアプリ起動: 23 分後に落ちた回は、落ちる前に同じアプリの強制終了と起動が 4 回通っている。別の回はアプリ起動の 11 秒後に落ちた。操作との対応は取れない。
- ホストの回線: 落ちていない。
- Emulator 37.2.12 への更新: リリースノートに Wi-Fi / netsim の修正は無い(2026-10-18 時点)。
判定
ゲストから外に出られず、ホストからは出られ、logcat に LOST_PROVISIONING か Last Resort Watchdog があれば本件と同じ症状の可能性が高い。
adb -s emulator-5554 shell "dumpsys connectivity | grep -m1 'Active default'; cmd wifi status | grep -m1 'connected to'; ping -c1 -W2 8.8.8.8 >/dev/null && echo guest-inet:OK || echo guest-inet:FAIL; logcat -d | grep -cE 'LOST_PROVISIONING|Last Resort Watchdog'"
ping -c1 -W1 8.8.8.8 >/dev/null && echo host-inet:OK || echo host-inet:FAIL
Active default network は再接続ループ中に none と番号を行き来するので、これだけでは判定できない。
回避
netsimd を Wi-Fi から外し、エミュレータ本体の virtio-wifi に戻す。ユーザー単位の feature 設定に 1 行。全 AVD と Android Studio からの起動に効く。
WiFiPacketStream = off
起動フラグなら -feature -WiFiPacketStream(下の SnapSync の PR で使われている形。未検証)。
再起動して -verbose の起動ログを見る。
DEBUG | FeatureControl::loadUserOverrideFeature: WiFiPacketStream = off
INFO | Feature 'WiFiPacketStream' (95) is overridden to 'disabled'
Successfully initialized netsim WiFi は出なくなる。netsimd は Bluetooth 用(netsim,id=bluetooth)に残る。netsimd 側の hostapd も起動するがゲストは繋がない(AP-STA-CONNECTED が出ない)。
ゲスト側。
$ adb shell cmd wifi status | grep 'connected to'
Wifi is connected to "AndroidWifi"
$ adb shell dumpsys connectivity | grep 'Active default'
Active default network: 100
確認できたのは、設定後の起動から 1 時間 55 分、10 秒間隔 618 回の疎通確認が全部通ったところまで。回避前は起動 23 分後に落ちていた。負荷をかけた長時間の確認はまだ。
virtio-wifi は netsimd 導入前の経路。netsimd で追加された機能(36.2.6 の記載では Wi-Fi Direct、AVD 間の mDNS、SoftAP)はたぶん使えない。未確認。
同じ回避をしている例
Emulator 37.2.12 の Gradle managed device で、netsimd の AP が認証に応答せず起動の約 1 割で Wi-Fi が無いまま終わる件に、同じ WiFiPacketStream = off を入れた PR。こちらは起動時点で死んでいて、「しばらくして落ちる」とは出方が違う。
参照
Emulator リリースノート。36.2.6 Canary に Wi-Fi のパケット処理を netsimd 経由にした記載。
netsim のログ・成果物の場所と、emulator -netsim-args="--pcap" でのパケットキャプチャ。バグ報告するならこれで採る。
Google Issue Tracker に一致する報告は、検索した範囲では見つからなかった。
