Czy można nawiązać połączenie z emulatorami systemu Android działającymi na komputerze Mac z maszyny wirtualnej z systemem Windows?
Aby nawiązać połączenie z emulatorem systemu Android uruchomionym na komputerze Mac z maszyny wirtualnej z systemem Windows, wykonaj następujące kroki:
Uwaga
Zalecamy używanie emulatora systemu Android, który nie zawiera sklepu Google Play.
Uruchom emulator na komputerze Mac.
Zabij
adb
serwer na komputerze Mac:adb kill-server
Należy pamiętać, że emulator nasłuchuje na 2 portach TCP w interfejsie sieciowym sprzężenia zwrotnego:
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)
Port numerowany nieparzystnie jest używany do nawiązywania połączenia z usługą
adb
. Zobacz też https://developer.android.com/tools/devices/emulator.html#emulatornetworking.Opcja 1. Użyj polecenia
nc
, aby przekazywać przychodzące pakiety TCP odbierane zewnętrznie na porcie 5555 (lub innym porcie, który chcesz) do portu nieparzystnego w interfejsie sprzężenia zwrotnego (127.0.0.1 5555 w tym przykładzie) i przekazać pakiety wychodzące z powrotem w inny sposób:cd /tmp mkfifo backpipe nc -kl 5555 0<backpipe | nc 127.0.0.1 5555 > backpipe
nc
Jeśli polecenia pozostaną uruchomione w oknie terminalu, pakiety będą przekazywane zgodnie z oczekiwaniami. Możesz wpisać Control-C w oknie terminalu, aby zamknąćnc
polecenia po zakończeniu korzystania z emulatora.(Opcja 1 jest zwykle łatwiejsza niż opcja 2, zwłaszcza jeśli Włączono zaporę zabezpieczeń i prywatności > preferencji > systemowych).
Opcja 2. Użyj polecenia
pfctl
, aby przekierować pakiety TCP z portu5555
(lub dowolnego innego portu) w interfejsie udostępnionej sieci do portu z numerem nieparzysonym w interfejsie sprzężenia zwrotnego (127.0.0.1:5555
w tym przykładzie):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 -
To polecenie konfiguruje przekazywanie portów przy użyciu usługi systemowej
pf packet filter
. Podziały wierszy są ważne. Pamiętaj, aby zachować je bez zmian podczas wklejania kopii. Musisz również dostosować nazwę interfejsu z maszyny wirtualnej vmnet8 , jeśli używasz usług Parallels.vmnet8
to nazwa specjalnego urządzenia NAT dla trybu sieci udostępnionej w narzędziu VMWare Fusion. Odpowiedni interfejs sieciowy w rozwiązaniach Równoległych jest prawdopodobnie vnic0.Połączenie do emulatora z komputera z systemem Windows:
C:\> adb connect ip-address-of-the-mac:5555
Zastąp ciąg "ip-address-of-the-mac" adresem IP komputera Mac, na przykład wyświetlonym przez
ifconfig vmnet8 | grep 'inet '
polecenie . W razie potrzeby zastąp5555
wartość innym portem, który chcesz wykonać w kroku 4. (Uwaga: jednym ze sposobów uzyskania dostępuadb
do wiersza polecenia jest użycie narzędzia Android > > Android Adb wiersza polecenia w programie Visual Studio).
Alternatywna technika przy użyciu ssh
Jeśli włączono zdalne logowanie na komputerze Mac, możesz użyć ssh
przekazywania portów, aby nawiązać połączenie z emulatorem.
Zainstaluj klienta SSH w systemie Windows. Jedną z opcji jest zainstalowanie narzędzia Git dla systemu Windows. Polecenie
ssh
będzie następnie dostępne w wierszu polecenia powłoki Git Bash .Wykonaj kroki od 1 do 3 z góry, aby uruchomić emulator, zabić
adb
serwer na komputerze Mac i zidentyfikować porty emulatora.Uruchom polecenie
ssh
w systemie Windows, aby skonfigurować dwukierunkowe przekierowywanie portów między portem lokalnym w systemie Windows (localhost:15555
w tym przykładzie) i portem emulatora z nieparzystnym numerem w interfejsie sprzężenia zwrotnego dla komputerów Mac (127.0.0.1:5555
w tym przykładzie):C:\> ssh -L localhost:15555:127.0.0.1:5555 mac-username@ip-address-of-the-mac
Zastąp
mac-username
ciąg nazwą użytkownika komputera Mac wymienioną nawhoami
liście . Zastąpip-address-of-the-mac
ciąg adresem IP komputera Mac.Połączenie do emulatora przy użyciu portu lokalnego w systemie Windows:
C:\> adb connect localhost:15555
(Uwaga: jednym z prostych sposobów uzyskania dostępu
adb
do wiersza polecenia jest użycie narzędzia Android > Android > Adb wiersza polecenia w programie Visual Studio).
Niewielka ostrożność: jeśli używasz portu 5555
dla portu lokalnego, pomyśli, adb
że emulator działa lokalnie w systemie Windows. Nie powoduje to żadnych problemów w programie Visual Studio, ale w Visual Studio dla komputerów Mac powoduje zamknięcie aplikacji natychmiast po uruchomieniu.
Alternatywna technika użycia adb -H
nie jest jeszcze obsługiwana
Teoretycznie innym podejściem byłoby użycie adb
wbudowanej możliwości łączenia się z serwerem adb
działającym na maszynie zdalnej (zobacz na przykład https://stackoverflow.com/a/18551325).
Jednak rozszerzenia IDE platformy Xamarin.Android nie zapewniają obecnie możliwości skonfigurowania tej opcji.
Informacje o kontakcie
W tym dokumencie omówiono bieżące zachowanie od marca 2016 r. Technika opisana w tym dokumencie nie jest częścią stabilnego zestawu testów dla platformy Xamarin, więc może to spowodować przerwanie w przyszłości.
Jeśli zauważysz, że technika nie działa lub jeśli zauważysz jakiekolwiek inne błędy w dokumencie, możesz dodać do dyskusji w następującym wątku forum: http://forums.xamarin.com/discussion/33702/android-emulator-from-host-device-inside-windows-vm. Dziękujemy.