Windows VM から Mac 上で動作する Android エミュレーターに接続できますか
Windows 仮想マシンから Mac で実行されている Android Emulator に接続するには、次のステップに従います。
Note
Google Play ストアを含まない Android Emulator を使用することをお勧めします。
Mac でエミュレーターを起動します。
Mac 上の
adb
サーバーを強制終了します。adb kill-server
エミュレーターは、ループバック ネットワーク インターフェイスの 2 つの TCP ポートでリッスンしていることにご注意ください。
lsof -iTCP -sTCP:LISTEN -P | grep 'emulator\|qemu' emulator6 94105 macuser 20u IPv4 0xa8dacfb1d4a1b51f 0t0 TCP localhost:5555 (LISTEN) emulator6 94105 macuser 21u IPv4 0xa8dacfb1d845a51f 0t0 TCP localhost:5554 (LISTEN)
奇数のポートは、
adb
に接続するために使用されます。 参照 https://developer.android.com/tools/devices/emulator.html#emulatornetworking.オプション 1:
nc
を使用して、ポート 5555 (またはその他の任意のポート) で外部に受信した受信 TCP パケットをループバック インターフェイスの奇数ポート (この例では 127.0.0.1 5555) に転送し、送信パケットを逆方向に転送します。cd /tmp mkfifo backpipe nc -kl 5555 0<backpipe | nc 127.0.0.1 5555 > backpipe
nc
コマンドがターミナル ウィンドウで実行されている限り、パケットは想定どおりに転送されます。 ターミナル ウィンドウに「Control-C」と入力すると、エミュレーターの使用が終わったときにnc
コマンドを終了できます。(特に、[システム環境設定] > [セキュリティとプライバシー] > [ファイアウォール] がオンになっている場合、オプション 1 は通常オプション 2 よりも簡単です。)
オプション 2:
pfctl
を使用して、共有ネットワーク インターフェイス上のポート5555
(またはその他の任意のポート) から、ループバック インターフェイスの奇数ポート (この例では127.0.0.1:5555
) に TCP パケットをリダイレクトします。sed '/rdr-anchor/a rdr pass on vmnet8 inet proto tcp from any to any port 5555 -> 127.0.0.1 port 5555' /etc/pf.conf | sudo pfctl -ef -
このコマンドは、
pf packet filter
システム サービスを使用したポート フォワーディングを設定します。 改行は重要です。 コピーして貼り付ける場合は、必ずそのままにしておいてください。 また、Parallels を使用している場合は、"vmnet8" からインターフェイス名を調整する必要があります。vmnet8
は、VMWare Fusion の "共有ネットワーク" モード用の特別な "NAT デバイス" の名前です。 Parallels の適切なネットワーク インターフェイスとしては、vnic0 が考えられます。Windows マシンからエミュレーターに接続します。
C:\> adb connect ip-address-of-the-mac:5555
"ip-address-of-the-mac" を
ifconfig vmnet8 | grep 'inet '
で表示されるような Mac の IP アドレスに置き換えます。 必要に応じて、5555
をステップ 4 の任意のポートに置き換えます。 (注:adb
へのコマンドライン アクセスを取得する方法の 1 つとして、Visual Studio の [ツール] > [Android] > [Android Adb コマンド プロンプト] を使用する方法があります。)
ssh
を使用した別の手法
Mac で "リモート ログイン" を有効にしている場合は、ssh
ポート フォワーディングを使用してエミュレーターに接続できます。
Windows に SSH クライアントをインストールします。 1 つのオプションが Git for Windows をインストールするものです。
ssh
コマンドが、Git Bash コマンド プロンプトで使用できるようになります。上記のステップ 1-3 に従ってエミュレーターを起動し、Mac で
adb
サーバーを強制終了して、エミュレーターのポートを特定します。Windows で
ssh
を実行して、Windows 上のローカル ポート (この例ではlocalhost:15555
) と、Mac のループバック インターフェイスの奇数のエミュレーター ポート (この例では127.0.0.1:5555
) との間に双方向のポート フォワーディングを設定します。C:\> ssh -L localhost:15555:127.0.0.1:5555 mac-username@ip-address-of-the-mac
mac-username
を、whoami
で一覧表示されている Mac ユーザー名に置き換えます。ip-address-of-the-mac
を Mac の IP アドレスに置き換えます。Windows のローカル ポートを使用してエミュレーターに接続します。
C:\> adb connect localhost:15555
(注:
adb
へのコマンドライン アクセスを取得する簡単な方法として、Visual Studio の [ツール] > [Android] > [Android Adb コマンド プロンプト] があります。)
注意: ローカル ポートにポート 5555
を使用すると、adb
はエミュレーターが Windows でローカルに実行されていると認識します。 これにより、Visual Studio では問題は発生しませんが Visual Studio for Mac では、アプリが起動直後に終了します。
adb -H
を使用した別の手法はまだサポートされていません
理論上は、別の方法として、adb
の組み込み機能を使用してリモート マシン上で実行されている adb
サーバーに接続する方法があります (例については、https://stackoverflow.com/a/18551325 を参照してください)。
ただし、現在、Xamarin.Android の IDE 拡張機能には、そのオプションを構成する方法が用意されていません。
連絡先情報
このドキュメントでは、2016 年 3 月時点での現在の動作について説明されています。 このドキュメントで説明されている手法は、Xamarin の安定したテスト スイートの一部ではないため、将来は使用できない可能性があります。
手法が動作しない、またはドキュメントに誤りがあることに気づいた場合は、フォーラムのスレッド http://forums.xamarin.com/discussion/33702/android-emulator-from-host-device-inside-windows-vm にディスカッションを追加してください。 よろしくお願いいたします。