È 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.
Avviare l'emulatore nel Mac.
Terminare il
adb
server sul Mac:adb kill-server
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.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 inc
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 porta5555
(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.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, sostituire5555
con l'altra porta desiderata nel passaggio 4. Nota: un modo per ottenere l'accesso dalla riga di comando aadb
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.
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 .Seguire i passaggi da 1 a 3 precedenti per avviare l'emulatore, terminare il
adb
server sul Mac e identificare le porte dell'emulatore.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 dawhoami
. Sostituireip-address-of-the-mac
con l'indirizzo IP del Mac.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 adb
la 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.