Compartir a través de


¿Es posible conectarse a emuladores de Android que se ejecutan en un Mac desde una máquina virtual de Windows?

Para conectarse a Android Emulator que se ejecuta en un equipo Mac desde una máquina virtual Windows, siga estos pasos:

Nota:

Se recomienda usar una instancia de Android Emulator que no incluya Google Play Store.

  1. Inicie el emulador en el equipo Mac.

  2. Elimine el servidor adb en el equipo Mac:

    adb kill-server
    
  3. Tenga en cuenta que el emulador realiza la escucha en dos puertos TCP en la interfaz de red de bucle invertido:

    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)
    

    El puerto con un número impar es el que se usa para conectarse a adb. Vea también https://developer.android.com/tools/devices/emulator.html#emulatornetworking.

  4. Opción 1: use nc para reenviar los paquetes TCP entrantes recibidos externamente en el puerto 5555 (o en cualquier otro puerto que prefiera) al puerto con un número impar en la interfaz de bucle invertido (127.0.0.1 5555 en este ejemplo) y para reenviar los paquetes salientes en la otra dirección:

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

    Siempre y cuando los comandos nc sigan ejecutándose en una ventana de terminal, los paquetes se reenviarán según lo esperado. Puede escribir Control-C en la ventana de terminal para salir de los comandos nc una vez que haya terminado de usar el emulador.

    (La opción 1 suele ser más fácil que la opción 2, especialmente si Preferencias del sistema > Seguridad y privacidad > Firewall está activado).

    Opción 2: use pfctl para redirigir los paquetes TCP desde el puerto 5555 (o cualquier otro puerto que prefiera) de la interfaz de redes compartidas hasta el puerto con un número impar de la interfaz de bucle invertido (127.0.0.1:5555 en este ejemplo):

    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 el reenvío de puertos mediante el servicio del sistema pf packet filter. Los saltos de línea son importantes. Asegúrese de mantenerlos intactos al copiarlos y pegarlos. También tendrá que ajustar el nombre de la interfaz vmnet8 si usa Parallels. vmnet8 es el nombre del dispositivo NAT especial para el modo de redes compartidas en VMWare Fusion. Es probable que la interfaz de red adecuada en Parallels sea vnic0.

  5. Conéctese al emulador desde la máquina Windows:

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

    Reemplace "ip-address-of-the-mac" por la dirección IP del equipo Mac, por ejemplo, como se muestra en ifconfig vmnet8 | grep 'inet '. Si es necesario, reemplace 5555 por el otro puerto que ha elegido en el paso 4. (Nota: Una manera de obtener acceso a adb mediante la línea de comandos es desde Herramientas > Android > Símbolo del sistema de Adb de Android en Visual Studio).

Técnica alternativa con ssh

Si ha habilitado Sesión remota en el equipo Mac, puede usar el reenvío de puertos ssh para conectarse al emulador.

  1. Instale un cliente SSH en Windows. Una opción es instalar Git para Windows. El comando ssh estará entonces disponible en el símbolo del sistema de Git Bash.

  2. Siga los pasos del 1 al 3 anteriores para iniciar el emulador, eliminar el servidor adb en el equipo Mac e identificar los puertos del emulador.

  3. Ejecute ssh en Windows para configurar el reenvío de puertos bidireccional entre un puerto local de Windows (localhost:15555 en este ejemplo) y el puerto del emulador con un número impar de la interfaz de bucle invertido de Mac (127.0.0.1:5555 en este ejemplo):

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

    Reemplace mac-username por el nombre de usuario de Mac como se indica en whoami. Reemplace ip-address-of-the-mac por la dirección IP del equipo Mac.

  4. Conéctese al emulador mediante el puerto local en Windows:

    C:\> adb connect localhost:15555
    

    (Nota: Una manera sencilla de obtener acceso a adb mediante la línea de comandos es desde Herramientas > Android > Símbolo del sistema de Adb de Android en Visual Studio).

Una pequeña precaución: si usa el puerto 5555 como puerto local, adb considerará que el emulador se ejecuta localmente en Windows. Esto no causa ningún problema en Visual Studio, pero sí en Visual Studio para Mac, donde hace que la aplicación se cierre inmediatamente después del inicio.

Todavía no se admite el uso de adb -H como técnica alternativa.

En teoría, otro enfoque sería usar la funcionalidad integrada de adb para conectarse a un servidor adb que se ejecuta en una máquina remota (vea por ejemplo https://stackoverflow.com/a/18551325). Sin embargo, las extensiones IDE de Xamarin.Android no proporcionan actualmente una manera de configurar esta opción.

Información de contacto

En este documento se describe el comportamiento actual a partir de marzo de 2016. La técnica descrita en este documento no forma parte del conjunto de pruebas estable para Xamarin, por lo que podría interrumpirse en el futuro.

Si observa que la técnica ya no funciona u observa otros errores en el documento, no dude en agregarlos a la discusión en el siguiente hilo del foro: http://forums.xamarin.com/discussion/33702/android-emulator-from-host-device-inside-windows-vm. Gracias.