Ich habe den von adb connect
cmb erwähnten Befehl noch nicht ausprobiert (oder sogar bemerkt) , aber ich kann bestätigen, dass das Weiterleiten der TCP-Ports selbst - beispielsweise über SSH - einwandfrei funktioniert.
Der Emulator überwacht zwei TCP-Ports pro Instanz: 5554 für die Telnet-Schnittstelle und 5555 für die Steuerungskommunikation mit Tools wie DDMS. Sie könnten also wahrscheinlich nur mit dem Weiterleitungsport 5555 davonkommen (obwohl ich es bisher nur mit beiden versucht habe). Jeder nachfolgende Emulator nimmt das nächste verfügbare Tupel mit gerader und ungerader Portnummer (bis zu 5580, glaube ich).
Als Referenz habe ich die folgenden Schritte auf meinem lokalen Computer ausgeführt:
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
killall adb; adb devices
Ich glaube, der Emulator versucht, einen lokalen ADB-Server beim Start zu benachrichtigen. Daher muss adb neu gestartet werden, damit die lokalen 5554+ Ports überprüft werden.
Beachten Sie, dass sich der localhost
Befehl ssh auf die lokale Schnittstelle des Remotecomputers bezieht .
adb devices
zeigte einen neuen Emulator - emulator-5554
- und ich konnte ihn so verwenden, als würde er auf meinem lokalen Computer ausgeführt.
killall adb
auch auf dem Server tun müssen, da der Emulator nicht mehrere Verbindungen akzeptiert undoffline
für den lokalen Computer bestimmt ist.Hier ist, wie ich es unter Windows gelöst habe. Ich bin Christophers Vorbild ziemlich genau gefolgt, kann es aber nicht bearbeiten, daher muss eine neue Antwort reichen.
Das Problem, das ich hatte, war, dass ADB und der Emulator für mich nur 127.0.0.1 und nicht 0.0.0.0 hörten. Sonst hätte ich TCPMon verwendet . Ich denke, dies ist entweder unter Windows anders oder hat sich mit den neuesten Versionen des SDK geändert. (Sie können mit überprüfen
netstat -ban
.)Ich habe WinSSHD auf dem Computer installiert, auf dem der Emulator ausgeführt wird. (Ich glaube, es sollte auch mit freeSSHd funktionieren, aber ich konnte dort kein Login zum Laufen bringen.)
Ich habe Port 22 (TCP) in der Windows-Firewall geöffnet. (WinSSHD kann das möglicherweise für Sie tun.)
Ich habe ein virtuelles Konto in der WinSSHD-GUI erstellt.
Ich habe eine neue PuTTY-Verbindung von der Entwicklungsmaschine zur Emulatormaschine hergestellt und sichergestellt, dass ich eine Verbindung herstellen kann.
Dann habe ich das Tunneln in PuTTY eingerichtet: Verbindung -> SSH -> Tunnel
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(Schließen Sie PuTTY an und lassen Sie es offen, um den Tunnel zu warten.)
Jetzt habe ich den Emulator auf dem Remote-Computer gestartet und sichergestellt, dass ADB dort nicht ausgeführt wird.
Ich habe ADB auf dem Entwicklungscomputer (
adb kill-server
dannadb start-server
) neu gestartet .adb devices
und der Remote-Emulator wurde als angezeigtemulator-5554 device
. Ich konnte meine App jetzt direkt von Eclipse / ADT aus bereitstellen und ausführen, wo der Emulator unter Virtuelle Geräte angezeigt wurde, als wäre er ein lokaler Emulator.quelle
Mir ist klar, dass diese Frage wirklich alt ist, aber ich habe das Problem etwas anders gelöst, und es hat eine Weile gedauert, bis ich diese triviale Lösung herausgefunden habe.
Normalerweise verwende ich einen Windows7-PC oder -Laptop (je nachdem, wo ich arbeite) als Front-End, da mir die GUI gefällt. Ich bevorzuge jedoch das Bearbeiten / Kompilieren / Debuggen auf einem kopflosen Ubuntu-Server Befehlszeilenleistung, die es bietet. Mein Ziel ist es, jedes Windows-System so dünn wie möglich zu machen, ohne zusätzliche Dienste (wie sshd) oder Firewall-Lücken.
Also hier ist das Senario:
Das zuvor beschriebene Problem besteht darin, dass der Emulator auf System-A an localhost und nicht an die externe Ethernet-Schnittstelle bindet, sodass adb auf System-B nicht auf den Emulator auf System-A zugreifen kann. Sie müssen lediglich die Remote-Port-Weiterleitung in PuTTY für Ihre SSH-Verbindung zu System-B einrichten. Der Trick besteht darin, das Optionsfeld "Remote" zu aktivieren, wenn Sie die beiden Tunnel so erstellen, dass die Tunnelrichtung umgekehrt wird (Tunneln von dem Server, bei dem Sie sich bei dem Client anmelden, von dem Sie sich anmelden).
Stellen Sie schließlich nach dem Herstellen der SSH-Verbindung eine Verbindung mit adb zu "localhost" auf System-B her:
Jetzt können Sie Bilder / Debug wie gewohnt herunterladen, und es ist trivial, auf ein anderes Windows-System zu wechseln, wenn Sie Ihren Laptop herausnehmen und Kaffee trinken möchten.
Indem Sie auf die gleiche Weise auch Port 5037 tunneln, können Sie Ihre ADB-Serververbindung tatsächlich weiterleiten, sodass Sie ein echtes Android-Gerät über USB auf System-A anschließen und Bilder von System-B darauf herunterladen können. Damit dies funktioniert, müssen Sie sicherstellen, dass der ADB-Server auf System-A und nicht auf System-B ausgeführt wird, bevor Sie Ihre SSH-Sitzung starten:
Starten Sie zuerst den ADB-Server auf System-A (Eingabeaufforderung).
Beenden Sie als Nächstes den ADB-Server auf System-B
Starten Sie abschließend Ihre SSH-Sitzung in System-B neu und überprüfen Sie sie
quelle
Ich habe einen einfachen Weg gefunden, dies zu tun, wenn sich Ihre beiden Computer im selben privaten Netzwerk befinden und daher keine SSH-Verschlüsselung verwenden müssen (was häufig der Fall ist). Dies kann hilfreich sein, da ein SSH-Tunnel sehr lang und schwierig zu installieren sein kann. Zum Beispiel kann die erstmalige Installation eines SSH-Daemons unter Cygwin / Windows zum Aufgeben führen (nun, ich habe aufgegeben).
Unter Windows muss Cygwin mit dem Paket httptunnel installiert sein . Dies muss auch unter Linux / httptunnel funktionieren, aber ich habe es nicht versucht.
Führen Sie den Emulator auf einem der Computer aus (sagen wir, sein Hostname ist HostEmulator ).
Starten Sie Eclipse auf dem anderen Computer (nennen wir es HostEclipse ).
Öffnen Sie auf jedem Computer ein Cygwin-Terminal und dann
Auf HostEmulator , geben Sie die folgenden Befehle Cygwin :
hts bedeutet HTTP-Tunnelserver .
Diese beiden Befehle erstellen zwei Halbbrücken, die die Ports 10001 und 10001 abhören und die E / A dieser Ports zu den lokalen Ports 5554 und 5555 umleiten, die die vom Emulator verwendeten Ports sind (eigentlich der erste gestartete Emulator - Wenn mehrere von ihnen ausgeführt werden, verwenden sie höhere Portnummern (siehe andere Antworten auf dieser Seite).
Auf HostEclipse , geben Sie diese hier :
htc bedeutet HTTP- Tunnel-Client .
Diese Befehle erstellen die fehlenden Halbbrücken. Sie lauschen den lokalen Ports 5554 und 5555 und leiten die E / A dieser Ports zu den Halbbrücken um, die wir kurz zuvor auf HostEmulator erstellt haben .
Geben Sie dann noch auf HostEclipse die folgenden drei Befehle ein :
Dadurch wird adb neu gestartet, da der Remote-Emulator sonst nicht erkannt wird. Beim Start muss ein Scan durchgeführt werden. Anschließend werden die Geräte (die verfügbaren Emulatoren) nur zur Überprüfung aufgelistet.
Sie können mit Ihrem Remote-Emulator so arbeiten, als wäre er lokal. Sie müssen die Cygwin-Terminals auf beiden Computern offen halten, sonst würden Sie die von Ihnen erstellten Halbbrücken töten.
Ich habe die Ports 10000 und 10001 für den Maschinen- / Maschinenaustausch hier verwendet, aber natürlich können Sie auch andere Ports verwenden, solange diese nicht bereits verwendet werden.
quelle
Meine Lösung für Windows + AndroVM (für die nur ein Host-Adapter erforderlich ist), wenn mein SSH-Dienst nicht gestartet werden konnte. Daher ist keine zusätzliche Software erforderlich.
Auf der cmd-Eingabeaufforderung als Administrator ausführen:
Öffnen Sie den TCP-Port 5555 in der Windows-Firewall.
Dann ab dem zweiten PC ausführen:
quelle
Keine der vorgeschlagenen Lösungen hat bei mir funktioniert. Ich habe mit der Lösung von Emirikol begonnen und sie verfeinert, da mit der neuen Android-API> 21 der Emulator offline angezeigt wurde und ich zu den Genymotion-Einstellungen gehen und den Android SDK-Pfad leer lassen musste. Und von der Kommandozeile:
Quelle: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ Haftungsausschluss, ich bin der Autor.
quelle
Wenn Sie adb ausführen, wird eine Serverkopie von sich selbst gestartet, falls noch keine ausgeführt wird. Sie können diese Kopie selbst auf dem Computer mit dem Gerät starten und seit SDK 4.3 können Sie ihm die Option -a geben, um diesen Server anzuweisen, auf Remotecomputer zu warten. Tun Sie dies mit dem folgenden Befehl, der nicht beendet wird:
adb -a -P 5037 Server Nodaemon
Setzen Sie auf dem Computer, von dem aus Sie das Gerät verwenden möchten, ADB_SERVER_SOCKET in einer Umgebungsvariablen auf tcp: xxxx: 5037 (oder geben Sie jedem ADB-Aufruf mit der Option -L den gleichen Wert), wobei xxxx die IP-Adresse oder der Hostname von ist Maschine mit den Geräten, und 5037 stimmt mit dem Port überein, den Sie im obigen Befehl angegeben haben.
Wir verwenden dies, um Zugriff auf etwa 100 Emulatoren zu gewähren, die auf 3 Computer verteilt sind, auf einen Computer, auf dem End-to-End-Tests parallel ausgeführt werden, und auf Entwickler, die echte Geräte remote freigeben möchten.
Sie können Ports mit adb forward und adb reverse zum und vom Emulator weiterleiten. Diese werden auf dem Computer mit den Geräten angezeigt (nicht auf dem Computer, auf dem Sie "adb forward" ausführen).
quelle
adb -L tcp:remotehost:1234 devices
Wenn dies der Fall ist, müssen Sie herausfinden, ob Android Studio Remote-ADBs unterstützt oder nicht - es würde mich nicht wundern, wenn es auf der Verwendung besteht lokale Geräte.Ich habe keinen zweiten Computer mit dem SDK zur Hand, aber ich stelle fest, dass die Listen-Ports des Emulators (Standard 5554, 5555) abhören
0.0.0.0
, dh von Remote-Computern aus erreichbar sind, und dassadb --help
einconnect <host>:<port>
Befehl angezeigt wird . Ich gehe davon aus, dass es dadurch angezeigt wird,adb devices
dassadb
Befehle daran arbeiten. Versuchen Sie für Eclipse "Konfigurationen ausführen / ausführen ..." und setzen Sie das Ziel auf "Manuell". Das gibt Ihnen eine "Geräteauswahl", die vermutlich einen Remote-Emulator enthält, wenn adb daran angeschlossen ist. Einen Versuch wert.quelle