共用方式為


從 Windows VM 連線到在 Mac 上執行的 Android 模擬器是否可行?

若要從 Windows 虛擬機連線到 Mac 上執行的 Android 模擬器,請使用下列步驟:

注意

我們建議使用不包含Google Play商店的Android模擬器。

  1. 在 Mac 上啟動模擬器。

  2. adb終止 Mac 上的伺服器:

    adb kill-server
    
  3. 請注意,模擬器正在回送網路介面上接聽 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

  4. 選項 1:用於 nc 將埠 5555(或任何其他您想要的埠)外部接收的輸入 TCP 封包轉送至回送介面上的奇數埠 (在此範例中為 127.0.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將共用網路介面上的 TCP 封包從埠5555(或任何其他您想要的埠)重新導向回送介面上的奇數埠(127.0.0.1:5555在此範例中):

    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

  5. 從 Windows 電腦 連線 模擬器:

    C:\> adb connect ip-address-of-the-mac:5555
    

    將 「ip-address-of-the-mac」 取代為 Mac 的 IP 位址,例如 ,如 所列。ifconfig vmnet8 | grep 'inet ' 如有需要,請將 取代 5555 為步驟 4 中您想要的其他埠。 (注意:取得命令行存取adb的其中一種方式是透過Visual Studio中的Tools > Android Android > Adb 命令提示字元

使用替代技術 ssh

如果您已在 Mac 上啟用 遠端登錄 ,您可以使用 ssh 埠轉送來連線到模擬器。

  1. 在 Windows 上安裝 SSH 用戶端。 其中一個選項是安裝 Git for Windowsssh命令接著會在 Git Bash 命令提示字元中提供。

  2. 請遵循上述步驟 1-3 來啟動模擬器、終止 adb Mac 上的伺服器,以及識別模擬器埠。

  3. 在 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 為您的 Mac 用戶名稱,如所列 whoami。 將取代 ip-address-of-the-mac 為 Mac 的 IP 位址。

  4. 使用 Windows 上的本機埠 連線 至模擬器:

    C:\> adb connect localhost:15555
    

    (注意:取得命令行存取adb的一個簡單方式是透過Visual Studio中的Tools > Android Android > Adb 命令提示字元

警告:如果您使用本機埠的埠 5555adb 會認為模擬器是在 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。 感謝您!