Udostępnij za pośrednictwem


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.

  1. Uruchom emulator na komputerze Mac.

  2. Zabij adb serwer na komputerze Mac:

    adb kill-server
    
  3. 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.

  4. 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 portu 5555 (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. vmnet8to 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.

  5. 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ąp 5555 wartość innym portem, który chcesz wykonać w kroku 4. (Uwaga: jednym ze sposobów uzyskania dostępu adb 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.

  1. 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 .

  2. Wykonaj kroki od 1 do 3 z góry, aby uruchomić emulator, zabić adb serwer na komputerze Mac i zidentyfikować porty emulatora.

  3. 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ą na whoamiliście . Zastąp ip-address-of-the-mac ciąg adresem IP komputera Mac.

  4. 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 adbwbudowanej 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.