从 Windows 虚拟机内部连接到 Mac 上的 Android Emulator

Android Emulator 会提供通用的网络功能,以用于不同的目的,包括从 Windows 虚拟机 (VM) 内部连接到 Mac 上运行的仿真器。 这在 Mac 上的 Parallels 中运行 Windows 时非常有用。 在此方案中,需要在 Mac 上使用仿真器,因为它无法在 Parallels 中运行。 有关在 Mac 上安装 Android Emulator 的信息,请参阅“安装”。

重要

开发计算机上的地址 127.0.0.1 对应于仿真器的环回接口。

从 Windows VM 内部连接到 Mac 上的 Android Emulator 有两种主要方法:

  1. 使用 nc 执行数据包转发。 有关详细信息,请参阅使用 nc 执行数据包转发
  2. 使用 ssh 端口转发。 更多信息请参阅使用 ssh 端口转发

在这两种情况下,Android Debug Bridge (ADB) 用于连接到仿真器。 ADB 是与 Android SDK 平台工具包捆绑在一起的命令行工具,可用于与设备通信。 该 adb 命令有助于执行各种设备操作,包括连接到设备。 有关 adb 的详细信息,请参阅 developer.android.com 上的 Android Debug Bridge (adb)

使用 nc 执行数据包转发

若要使用数据包转发从 Windows VM 连接到 Mac 上运行的 Android Emulator,请按照以下步骤操作:

  1. 在 Mac 上,启动 Android Emulator。

  2. 在 Mac 上,打开“终端”。

  3. 在“终端”中,终止 adb 服务器:

    adb kill-server
    
  4. 在“终端”中,识别仿真器使用的端口:

    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)
    

    仿真器使用一对顺序 TCP 端口 - 一个用于控制台连接的偶数端口,以及一个用于 adb 连接的奇数端口。 在上面的输出中,仿真器在端口 5555 上侦听 adb,并在端口 5554 上侦听控制台连接。

  5. 在“终端”中,使用 nc 将外部端口 5555(或其他任何端口)收到的入站 TCP 数据包转发到环回接口上的奇数端口,并以另一种方式将出站数据包转发回来:

    cd /tmp
    mkfifo backpipe
    nc -kl 5555 0<backpipe | nc 127.0.0.1 5555 > backpipe
    

    在此示例中,127.0.0.1 5555 表示环回接口上的奇数端口。

    只要 nc 命令继续在终端窗口中运行,数据包就会按预期转发。 使用完仿真器后,可以在终端窗口中按 Ctrl+Cnc 停止执行数据包转发。

  6. 在 Windows VM 中,打开命令提示符

  7. 命令提示符中,连接到仿真器:

    adb connect ip-address-of-the-mac:5555
    

    将此示例中的 ip-address-of-the-mac 替换为 Mac 的 IP 地址,并将 5555 替换为上一步中使用的端口。

    注意

    可以通过“工具”>“Android”>“Android Adb 命令提示符...”菜单项在 Visual Studio 中获取对 adb 的访问权限。

完成连接后,Visual Studio 将在“Android 本地设备”下将仿真器显示为调试目标,该目标可用于将应用部署到仿真器。

使用 ssh 端口转发

如果已在 Mac 上启用“远程登录”,可以使用 ssh 端口转发来连接到仿真器。

重要

ssh 端口转发要求你已在 Windows VM 中安装 SSH 客户端。 一种选择是安装 Git for Windows。 然后,ssh 命令会在 Git Bash 命令提示符中可用。

若要使用 ssh 端口转发从 Windows 虚拟机连接到 Mac 上运行的 Android Emulator,请按照以下步骤操作:

  1. 在 Mac 上,启动 Android Emulator。

  2. 在 Mac 上,打开“终端”。

  3. 在“终端”中,终止 adb 服务器:

    adb kill-server
    
  4. 在“终端”中,识别仿真器使用的端口:

    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)
    

    仿真器使用一对顺序 TCP 端口 - 一个用于控制台连接的偶数端口,以及一个用于 adb 连接的奇数端口。 在上面的输出中,仿真器在端口 5555 上侦听 adb,并在端口 5554 上侦听控制台连接。

  5. 在 Windows VM 中,打开命令提示符

  6. 在“命令提示符”中,运行 ssh,以在 Windows 上的本地端口和 Mac 环回接口上的奇数仿真器端口之间设置双向端口转发:

    ssh -L localhost:15555:127.0.0.1:5555 mac-username@ip-address-of-the-mac
    

    在此示例中,localhost:15555 表示 Windows 上的本地端口,127.0.0.1 5555 表示环回接口上的奇数端口。

    mac-username 替换为 Mac 用户名(该用户名可以通过 whoami 命令获得),并将 ip-address-of-the-mac 替换为 Mac 的 IP 地址。

  7. 在“命令提示符”中,使用本地端口连接到仿真器:

    adb connect localhost:15555
    

    在此示例中,localhost:15555 表示 Windows 上的本地端口

    注意

    可以通过“工具”>“Android”>“Android Adb 命令提示符...”菜单项在 Visual Studio 中获取对 adb 的访问权限。

完成连接后,Visual Studio 将在“Android 本地设备”下将仿真器显示为调试目标,该目标可用于将应用部署到仿真器。