Freigeben über


Ist es möglich, über eine Windows-VM mit den Android-Emulatoren, die auf einem Mac ausgeführt werden, eine Verbindung herzustellen?

Führen Sie die folgenden Schritte aus, um aus einer Windows-VM eine Verbindung mit dem Android-Emulator herzustellen, der auf einem Mac ausgeführt wird:

Hinweis

Sie sollten einen Android-Emulator verwenden, der den Google Play Store nicht enthält.

  1. Starten Sie den Emulator auf dem Mac.

  2. Beenden Sie den adb-Server auf dem Mac:

    adb kill-server
    
  3. Beachten Sie, dass der Emulator an 2 TCP-Ports auf der Loopback-Netzwerkschnittstelle lauscht:

    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)
    

    Der Port mit der ungeraden Nummer ist der Port, der für die Verbindung mit adb verwendet wird. Siehe auch https://developer.android.com/tools/devices/emulator.html#emulatornetworking.

  4. Option 1: Verwenden Sie diese Option nc , um eingehende TCP-Pakete weiterzuleiten, die extern an Port 5555 (oder einen anderen gewünschten Port) an den ungeraden Port auf der Loopbackschnittstelle (127.0.0.1 5555 in diesem Beispiel) empfangen werden, und um die ausgehenden Pakete auf die andere Weise weiterzuleiten:

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

    Solange die nc-Befehle in einem Terminalfenster ausgeführt werden, werden die Pakete erwartungsgemäß weitergeleitet. Sie können im Terminalfenster STRG-C eingeben, um die Ausführung der nc-Befehle zu beenden, sobald Sie die Verwendung des Emulators abgeschlossen haben.

    (Option 1 ist in der Regel einfacher als Option 2, insbesondere, wenn Die Sicherheits- und Datenschutzfirewall > der Systemeinstellungen > wird aktiviert.)

    Option 2: Verwenden Sie diese Option pfctl , um TCP-Pakete von Port 5555 (oder einem anderen gewünschten Port) auf der Shared Networking-Schnittstelle an den ungeraden Port auf der Loopbackschnittstelle127.0.0.1:5555 (in diesem Beispiel) umzuleiten:

    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 -
    

    Mit diesem Befehl wird Portweiterleitung mithilfe des Systemdiensts pf packet filter eingerichtet. Die Zeilenumbrüche sind wichtig. Achten Sie darauf, dass sie beim Kopieren und Einfügen erhalten bleiben. Wenn Sie Parallels verwenden, müssen Sie außerdem den Schnittstellennamen von vmnet8 anpassen. vmnet8 ist der Name des speziellen NAT-Geräts für den gemeinsamen Netzwerkmodus in VMware Fusion. Die entsprechende Netzwerkschnittstelle in Parallels ist wahrscheinlich vnic0.

  5. Stellen Sie vom Windows-Computer aus eine Verbindung mit dem Emulator her:

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

    Ersetzen Sie „ip-address-of-the-mac“ durch die IP-Adresse des Macs, wie sie beispielsweise von ifconfig vmnet8 | grep 'inet ' aufgelistet wird. Ersetzen Sie bei Bedarf den anderen Port, 5555 den Sie mögen, aus Schritt 4. (Hinweis: Eine Möglichkeit zum Abrufen des Befehlszeilenzugriffs adb über Tools > Android Android > Adb-Eingabeaufforderung in Visual Studio.)

Alternatives Verfahren mit ssh

Wenn Sie Entfernte Anmeldung auf dem Mac aktiviert haben, können Sie ssh-Portweiterleitung verwenden, um eine Verbindung mit dem Emulator herzustellen.

  1. Installieren Sie einen SSH-Client unter Windows. Eine Option besteht darin, Git für Windows zu installieren. Der ssh-Befehl steht dann an der Git Bash-Eingabeaufforderung zur Verfügung.

  2. Führen Sie die Schritte 1 bis 3 von oben aus, um den Emulator zu starten, den adb Server auf dem Mac zu beenden und die Emulatorports zu identifizieren.

  3. Führen Sie ssh unter Windows aus, um die bidirektionale Portweiterleitung zwischen einem lokalen Port unter Windows (in diesem Beispiel localhost:15555) und dem ungeraden Emulatorport auf der Loopback-Schnittstelle des Macs (in diesem Beispiel 127.0.0.1:5555) einzurichten:

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

    Ersetzen Sie mac-username durch Ihren Mac-Benutzernamen, wie von whoami aufgelistet. Ersetzen Sie ip-address-of-the-mac durch die IP-Adresse des Macs.

  4. Stellen Sie eine Verbindung mit dem Emulator über den lokalen Port unter Windows her:

    C:\> adb connect localhost:15555
    

    (Hinweis: Eine einfache Möglichkeit zum Abrufen des Befehlszeilenzugriffs adb erfolgt über tools > Android > Android Adb Command Prompt in Visual Studio.)

Eine kleine Mahnung: Wenn Sie Port 5555 als lokalen Port verwenden, nimmt adb an, dass der Emulator lokal unter Windows ausgeführt wird. Dies führt zwar nicht zu Problemen in Visual Studio, in Visual Studio für Mac bewirkt es aber das sofortige Schließen der App nach dem Start.

Es wird noch keine alternative Technik unterstützt, die adb -H verwendet.

Theoretisch besteht ein anderer Ansatz darin, die integrierte adb-Funktion zum Herstellen einer Verbindung mit einem adb-Server zu verwenden, der auf einem Remotecomputer ausgeführt wird (siehe z. B. https://stackoverflow.com/a/18551325). Die IDE-Erweiterungen von Xamarin.Android bieten jedoch aktuell keine Möglichkeit, diese Option zu konfigurieren.

Kontaktinformationen

In diesem Dokument wird das im März 2016 aktuelle Verhalten besprochen. Die in diesem Artikel beschriebene Technik ist kein Teil einer stabilen Testsammlung für Xamarin. Sie könnte daher in Zukunft nicht mehr unterstützt werden.

Wenn Sie feststellen, dass das Verfahren nicht mehr funktioniert oder Ihnen andere Fehler im Dokument auffallen, beteiligen Sie sich an der Diskussion im folgenden Forenthread: http://forums.xamarin.com/discussion/33702/android-emulator-from-host-device-inside-windows-vm. Vielen Dank!