Condividi tramite


È possibile connettersi a emulatori Android in esecuzione in un Mac da una macchina virtuale Windows?

Per connettersi all'emulatore Android in esecuzione in un Mac da una macchina virtuale Windows, seguire questa procedura:

Nota

È consigliabile usare un emulatore Android che non include Google Play Store.

  1. Avviare l'emulatore nel Mac.

  2. Terminare il adb server sul Mac:

    adb kill-server
    
  3. Si noti che l'emulatore è in ascolto su 2 porte TCP nell'interfaccia di rete di 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)
    

    La porta con numeri dispari è quella usata per connettersi a adb. Vedere anche https://developer.android.com/tools/devices/emulator.html#emulatornetworking.

  4. Opzione 1: usare nc per inoltrare i pacchetti TCP in ingresso ricevuti esternamente sulla porta 5555 (o qualsiasi altra porta desiderata) alla porta dispari nell'interfaccia di loopback (127.0.0.1 5555 in questo esempio) e per inoltrare i pacchetti in uscita in altro modo:

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

    Se i nc comandi rimangono in esecuzione in una finestra del terminale, i pacchetti verranno inoltrati come previsto. È possibile digitare Control-C nella finestra Del terminale per chiudere i nc comandi al termine dell'uso dell'emulatore.

    L'opzione 1 è in genere più semplice dell'opzione 2, soprattutto se Sicurezza e privacy > del firewall per le preferenze > di sistema è attivato.

    Opzione 2: usare pfctl per reindirizzare i pacchetti TCP dalla porta 5555 (o da qualsiasi altra porta desiderata) nell'interfaccia di rete condivisa alla porta con numeri dispari nell'interfaccia di loopback (127.0.0.1:5555 in questo esempio):

    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 -
    

    Questo comando configura l'inoltro delle porte usando il pf packet filter servizio di sistema. Le interruzioni di riga sono importanti. Assicurarsi di mantenerli intatti durante il incollamento della copia. È anche necessario modificare il nome dell'interfaccia da vmnet8 se si usa Parallels. vmnet8è il nome del dispositivo NAT speciale per la modalità rete condivisa in VMWare Fusion. L'interfaccia di rete appropriata in Parallels è probabilmente vnic0.

  5. Connessione all'emulatore dal computer Windows:

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

    Sostituire "ip-address-of-the-mac" con l'indirizzo IP del Mac, ad esempio come indicato da ifconfig vmnet8 | grep 'inet '. Se necessario, sostituire 5555 con l'altra porta desiderata nel passaggio 4. Nota: un modo per ottenere l'accesso dalla riga di comando a adb consiste nell'usare Strumenti >> Android Adb Command Prompt in Visual Studio.

Tecnica alternativa con ssh

Se è stato abilitato Accesso remoto sul Mac, è possibile usare ssh il port forwarding per connettersi all'emulatore.

  1. Installare un client SSH in Windows. Un'opzione consiste nell'installare Git per Windows. Il ssh comando sarà quindi disponibile nel prompt dei comandi di Git Bash .

  2. Seguire i passaggi da 1 a 3 precedenti per avviare l'emulatore, terminare il adb server sul Mac e identificare le porte dell'emulatore.

  3. Eseguire ssh in Windows per configurare l'inoltro delle porte bidirezionali tra una porta locale in Windows (localhost:15555 in questo esempio) e la porta dell'emulatore con numeri dispari nell'interfaccia di loopback del Mac (127.0.0.1:5555 in questo esempio):

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

    Sostituire mac-username con il nome utente Mac come indicato da whoami. Sostituire ip-address-of-the-mac con l'indirizzo IP del Mac.

  4. Connessione all'emulatore usando la porta locale in Windows:

    C:\> adb connect localhost:15555
    

    Nota: un modo semplice per ottenere l'accesso dalla riga di comando a adb è tramite Strumenti > prompt dei comandi Android > Adb android in Visual Studio.

Una piccola attenzione: se si usa la porta 5555 per la porta locale, adb si pensa che l'emulatore sia in esecuzione in locale in Windows. Ciò non causa problemi in Visual Studio, ma in Visual Studio per Mac causa l'uscita dell'app immediatamente dopo l'avvio.

L'uso adb -H di tecniche alternative non è ancora supportato

In teoria, un altro approccio consiste nell'usare adbla funzionalità predefinita per connettersi a un adb server in esecuzione in un computer remoto (vedere ad esempio https://stackoverflow.com/a/18551325). Tuttavia, le estensioni dell'IDE Xamarin.Android non offrono attualmente un modo per configurare tale opzione.

Informazioni sul contatto

Questo documento illustra il comportamento corrente a partire da marzo 2016. La tecnica descritta in questo documento non fa parte del gruppo di test stabile per Xamarin, quindi potrebbe interrompersi in futuro.

Se si nota che la tecnica non funziona più o se si notano altri errori nel documento, è possibile aggiungere alla discussione nel thread del forum seguente: http://forums.xamarin.com/discussion/33702/android-emulator-from-host-device-inside-windows-vm. Grazie.