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.
Starten Sie den Emulator auf dem Mac.
Beenden Sie den
adb
-Server auf dem Mac:adb kill-server
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.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 dernc
-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 Port5555
(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.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 Befehlszeilenzugriffsadb
ü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.
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.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.Führen Sie
ssh
unter Windows aus, um die bidirektionale Portweiterleitung zwischen einem lokalen Port unter Windows (in diesem Beispiellocalhost:15555
) und dem ungeraden Emulatorport auf der Loopback-Schnittstelle des Macs (in diesem Beispiel127.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 vonwhoami
aufgelistet. Ersetzen Sieip-address-of-the-mac
durch die IP-Adresse des Macs.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!