kakts-log

programming について調べたことを整理していきます

VPN接続時にAndroid Studioで「loading devices」の表示のままデバイス選択ができなくなる

概要

Android Studioにおいて、Androidアプリの開発時の動作確認にVirtual Deviceを使う場合、デバイス選択項目の箇所に「loading devices」と表示が出たままでDeviceが選択できなくなる場合があります。

原因は複数あるかと思いますが、私の環境で直面した原因の1つについて整理します。

前提条件

  • Android Debug: Bridge version 1.0.41
  • Android SDK: Version 35.0.2-12147458
  • Local OS: Running on Darwin 24.1.0 (arm64)

まとめ

VPN接続下でADB(Android Debug Bridge)のサーバが起動しないのが原因のようでした。

  • 今回はAndroid Virtual Deviceを利用し、Android Studio上でVirtual Deviceでアプリの動作確認をしようとしていた。
  • Virtual Deviceを利用する際にデバイスと接続するためのadb (Android Debug Bridge) コマンドでのadbサーバ を起動時にエラーが発生していた。
  • Android Studio のNotificationsタブでログを確認すると、Android sdk内のplatform-tools内に含まれているadbの起動が失敗するエラーが出ていた。
'/Users/hoge/Library/Android/sdk/platform-tools/adb start-server' failed -- run manually if necessary
  • adbのstart-server実行時にudp socketへのbindを試みている処理でエラーが出ている
./adb start-server
* daemon not running; starting now at tcp:5037
ADB server didn't ACK
Full server startup log: /var/folders/t1/cm12lwy17mgbt4nkxr4_csj40000gn/T//adb.501.log
Server had pid: 9223
--- adb starting (pid 9223) ---
12-19 23:42:11.709  9223 300100 I adb     : main.cpp:63 Android Debug Bridge version 1.0.41
12-19 23:42:11.709  9223 300100 I adb     : main.cpp:63 Version 35.0.2-12147458
....
12-19 23:42:11.709  9223 300100 I adb     : main.cpp:63 Running on Darwin 24.1.0 (arm64)
12-19 23:42:11.709  9223 300100 I adb     : main.cpp:63 
12-19 23:42:11.713  9223 300100 I adb     : auth.cpp:416 adb_auth_init...
12-19 23:42:11.713  9223 300100 I adb     : auth.cpp:152 loaded new key from '/Users/hoge/.android/adbkey' with fingerprint ...
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:170 AdbUdpSocket fd=9
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:274 SetMulticastOutboundInterface for index=12
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:533 bind endpoint=0.0.0.0:5353
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:170 AdbUdpSocket fd=11
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:274 SetMulticastOutboundInterface for index=14
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:558 bind endpoint=[0000:0000:0000:0000:0000:0000:0000:0000]:5353 scope_id=0
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:170 AdbUdpSocket fd=12
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:274 SetMulticastOutboundInterface for index=16
12-19 23:42:11.714  9223 300100 I adb     : udp_socket.cpp:558 bind endpoint=[0000:0000:0000:0000:0000:0000:0000:0000]:5353 scope_id=0
12-19 23:42:11.738  9223 300100 F adb     : udp_socket.cpp:447 Check failed: static_cast<size_t>(num_bytes_sent) == length (static_cast<size_t>(num_bytes_sent)=12, length=33) 

upd socketに対して何かしらを送信している箇所でのチェックに失敗している。

今回の原因

  • 私のローカルPCでVPNに接続しており、VPN接続している際に上記のチェックに失敗してしまっていた。
    • VPNを有効にしている際に、ローカル環境でのネットワークの設定変更が悪さをしているようです。
    • VPNを使わないようにし、Androis Studio再起動でadb start-serverが成功しました。
* daemon started successfully

別の対処方法

  • VPNを接続した状態でもadb serverを起動できるようです。
ADB_MDNS_OPENSCREEN=0 adb start-server
  • Android SDK 35.0.2では ローカル環境でのデバイスを見つける際に使われているmDNSの設定に変更があり mDNSがデフォルトで有効になっているようです。 (確認し切れてはいないですが、おそらくこの辺りの変更が原因となっていそうです。) developer.android.com `ADB_MDNS_OPENSCREENという環境変数を0にすることで無効化し、VPN接続下でもadb serverを起動できるようです。
ADB_MDNS_OPENSCREEN=0 adb start-server
- 不完全なクエリでサーバーが停止する、openscreen mDNS バックエンドのバグ(問題 #294120933)を修正。
- macOS で openscreen mDNS バックエンドを動作可能に
- すべてのプラットフォームで openscreen mDNS バックエンドをデフォルトにする。
- 診断目的で USB SuperSpeed+(現在の速度とネゴシエートされた速度)を検出するサポート。
- 正常なシャットダウン: シャットダウン時にすべての USB インターフェースを解放します(すべての OS)。

ローカルでのmDNSデーモンが稼働しているかのチェック方法

adb mdns check を実行するとローカル環境でのmDNSのデーモンが稼働しているかをチェックできます。

試してみると、VPN接続時にmDNSデーモンの稼働チェックに失敗しており、デーモンが稼働しておらず、VPN接続を解除によりデーモンが稼働しているのを確認できました。

---- VPN接続中 -------
./adb mdns check
* daemon not running; starting now at tcp:5037
ADB server didn't ACK
Full server startup log: /var/folders/t1/cm12lwy17mgbt4nkxr4_csj40000gn/T//adb.501.log
Server had pid: 12024
--- adb starting (pid 12024) ---
12-20 00:31:51.337 12024 533719 I adb     : main.cpp:63 Android Debug Bridge version 1.0.41
12-20 00:31:51.337 12024 533719 I adb     : main.cpp:63 Version 35.0.2-12147458
12-20 00:31:51.337 12024 533719 I adb     : main.cpp:63 Installed as 

....
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:170 AdbUdpSocket fd=11
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:274 SetMulticastOutboundInterface for index=12
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:533 bind endpoint=0.0.0.0:5353
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:170 AdbUdpSocket fd=12
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:274 SetMulticastOutboundInterface for index=14
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:558 bind endpoint=[0000:0000:0000:0000:0000:0000:0000:0000]:5353 scope_id=0
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:170 AdbUdpSocket fd=13
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:274 SetMulticastOutboundInterface for index=16
12-20 00:31:51.342 12024 533719 I adb     : udp_socket.cpp:558 bind endpoint=[0000:0000:0000:0000:0000:0000:0000:0000]:5353 scope_id=0
12-20 00:31:51.342 12024 533729 I adb     : transport.cpp:313 emulator-5554: write thread spawning
12-20 00:31:51.342 12024 533728 I adb     : transport.cpp:341 emulator-5554: read thread spawning
12-20 00:31:51.346 12024 533719 I adb     : transport.cpp:1710 fetching keys for transport emulator-5554
12-20 00:31:51.346 12024 533719 I adb     : auth.cpp:468 Calling send_auth_response
12-20 00:31:51.350 12024 533719 I adb     : adb.cpp:181 emulator-5554: offline
12-20 00:31:51.378 12024 533719 F adb     : udp_socket.cpp:447 Check failed: static_cast<size_t>(num_bytes_sent) == length (static_cast<size_t>(num_bytes_sent)=13, length=45) 

* failed to start daemon
adb: failed to check server version: cannot connect to daemon

----- ここで VPNの接続を解除する ---------

./adb mdns check
mdns daemon version [Openscreen discovery 0.0.0]

ADB (Android Debug Bridge)について

ADBについての情報は下記のページで詳細を確認できます。 developer.android.com