É possível se conectar aos emuladores de Android em execução em um Mac usando uma VM do Windows?
Para se conectar ao emulador Android em execução em um Mac a partir de uma máquina virtual do Windows, use as seguintes etapas:
Observação
Recomendamos o uso de um emulador Android que não inclua a Google Play Store.
Inicie o emulador no Mac.
Mate o
adb
servidor no Mac:adb kill-server
Observe que o emulador está escutando em 2 portas TCP na interface de rede de loopback:
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)
A porta ímpar é a usada para se conectar ao
adb
. Consulte também https://developer.android.com/tools/devices/emulator.html#emulatornetworking.Opção 1: Use
nc
para encaminhar pacotes TCP de entrada recebidos externamente na porta 5555 (ou qualquer outra porta desejada) para a porta ímpar na interface de loopback (127.0.0.1 5555 neste exemplo) e para encaminhar os pacotes de saída de volta para o outro lado:cd /tmp mkfifo backpipe nc -kl 5555 0<backpipe | nc 127.0.0.1 5555 > backpipe
Enquanto os
nc
comandos permanecerem em execução em uma janela do Terminal, os pacotes serão encaminhados conforme o esperado. Você pode digitar Control-C na janela Terminal para encerrar osnc
comandos assim que terminar de usar o emulador.(A opção 1 é geralmente mais fácil do que a opção 2, especialmente se Preferências > do Sistema Segurança & Privacidade > O Firewall está ativado.)
Opção 2: Use
pfctl
para redirecionar pacotes TCP da porta (ou qualquer outra porta desejada) na interface de rede compartilhada para a porta5555
ímpar na interface de loopback (127.0.0.1:5555
neste exemplo):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 -
Este comando configura o encaminhamento de porta usando o serviço do
pf packet filter
sistema. As quebras de linha são importantes. Certifique-se de mantê-los intactos ao copiar e colar. Você também precisará ajustar o nome da interface do vmnet8 se estiver usando o Parallels.vmnet8
é o nome do dispositivo NAT especial para o modo de rede compartilhada no VMWare Fusion. A interface de rede apropriada no Parallels é provavelmente vnic0.Conecte-se ao emulador a partir da máquina Windows:
C:\> adb connect ip-address-of-the-mac:5555
Substitua "ip-address-of-the-mac" pelo endereço IP do Mac, por exemplo, conforme listado pelo
ifconfig vmnet8 | grep 'inet '
. Se necessário, substitua5555
pela outra porta desejada na etapa 4. (Nota: uma maneira de obter acessoadb
à linha de comando é através de ferramentas > Android > Android Adb Command Prompt no Visual Studio.)
Técnica alternativa usando ssh
Se você ativou o Login Remoto no Mac, poderá usar ssh
o encaminhamento de porta para se conectar ao emulador.
Instale um cliente SSH no Windows. Uma opção é instalar o Git para Windows. O
ssh
comando estará disponível no prompt de comando do Git Bash .Siga as etapas 1 a 3 acima para iniciar o emulador, matar o
adb
servidor no Mac e identificar as portas do emulador.Execute
ssh
no Windows para configurar o encaminhamento de porta bidirecional entre uma porta local no Windows (neste exemplo) e a porta do emulador ímpar na interface de loopback do Mac (localhost:15555
127.0.0.1:5555
neste exemplo):C:\> ssh -L localhost:15555:127.0.0.1:5555 mac-username@ip-address-of-the-mac
Substitua
mac-username
pelo nome de usuário do Mac, conforme listado pelowhoami
. Substituaip-address-of-the-mac
pelo endereço IP do Mac.Conecte-se ao emulador usando a porta local no Windows:
C:\> adb connect localhost:15555
(Nota: uma maneira fácil de obter acesso
adb
à linha de comando é através das Ferramentas > Android > Adb Prompt de Comando no Visual Studio.)
Um pequeno cuidado: se você usar a porta para a porta 5555
local, adb
pensará que o emulador está sendo executado localmente no Windows. Isso não causa nenhum problema no Visual Studio, mas no Visual Studio para Mac faz com que o aplicativo saia imediatamente após a inicialização.
O uso adb -H
de técnicas alternativas ainda não é suportado
Em teoria, outra abordagem seria usar adb
a capacidade interna do para se conectar a um adb
servidor em execução em uma máquina remota (veja por exemplo https://stackoverflow.com/a/18551325).
Mas as extensões IDE Xamarin.Android atualmente não fornecem uma maneira de configurar essa opção.
Informações do contato
Este documento discute o comportamento atual em março de 2016. A técnica descrita neste documento não faz parte do conjunto de testes estável do Xamarin, portanto, pode quebrar no futuro.
Se você notar que a técnica não funciona mais, ou se você notar quaisquer outros erros no documento, sinta-se livre para adicionar à discussão no seguinte tópico do fórum: http://forums.xamarin.com/discussion/33702/android-emulator-from-host-device-inside-windows-vm. Obrigado!