Поделиться через


Можно ли подключиться с виртуальной машины Windows к эмуляторам Android под управлением Mac?

Чтобы подключиться к Android Emulator, работающему на компьютере Mac, из виртуальной машины Windows, выполните следующие действия.

Примечание.

Рекомендуется использовать Android Emulator без встроенного Магазина Google Play.

  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 для пересылки входящих TCP-пакетов, полученных вне порта 5555 (или любого другого порта, который вам нравится) в нечетный порт интерфейса петли (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 — это имя специального устройства NAT для режима Shared Networking (Общий сетевой интерфейс) в VMWare Fusion. Для Parallels, вероятно, подойдет сетевой интерфейс vnic0.

  5. Подключитесь к эмулятору с компьютера Windows:

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

    Замените "ip-address-of-the-mac" на IP-адрес компьютера Mac, например тот, который указан ifconfig vmnet8 | grep 'inet '. При необходимости замените 5555 другой порт, который вам нравится на шаге 4. (Примечание. Один из способов получения доступа к adb командной строке — с помощью> командной строки Android Android > ADB в Visual Studio.)

Альтернативный способ с использованием ssh

Если вы включили Удаленный вход на компьютере Mac, для подключения к эмулятору можно использовать перенаправление портов с помощью ssh.

  1. Установите SSH-клиент в Windows. Один из вариантов — установить Git для Windows. Тогда команда ssh будет доступна в командной строке Git Bash.

  2. Выполните шаги 1-3 выше, чтобы запустить эмулятор, убить adb сервер на Компьютере Mac и определить порты эмулятора.

  3. Запустите ssh в Windows, чтобы настроить двустороннюю переадресацию портов между локальным портом в 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 IP-адресом компьютера Mac.

  4. Подключитесь к эмулятору через локальный порт в Windows:

    C:\> adb connect localhost:15555
    

    (Примечание. Один из простых способов получить доступ к adb командной строке — с помощью> командной строки Android > Android ADB в Visual Studio.)

Небольшое предупреждение. Если в качестве локального порта используется порт 5555, adb считает, что эмулятор выполняется локально в Windows. Это не создает проблем в Visual Studio, но в Visual Studio для Mac приводит к завершению работы приложения сразу после запуска.

Альтернативный метод, использующий adb -H, пока не поддерживается.

Теоретически можно было бы использовать встроенные возможности adb для подключения к серверу adb, работающему на удаленном компьютере (см. пример https://stackoverflow.com/a/18551325). Однако расширения IDE Xamarin.Android в настоящее время не предоставляют возможности для настройки этого параметра.

Контактная информация

В этом документе рассматривается текущее поведение по состоянию на март 2016 года. Методика, описанная в этом документе, не является частью стабильного набора тестов для Xamarin, поэтому в будущем ее поддержка может прерваться.

Если вы заметили, что методика больше не работает, или обратили внимание на другие ошибки в документе, вы можете добавить обсуждение в следующую беседу форума: http://forums.xamarin.com/discussion/33702/android-emulator-from-host-device-inside-windows-vm. Спасибо!