Remote-Debugging mit Android-Emulator

93

Ist es möglich, den Code zu schreiben / die Android-Anwendung auf einem Computer zu kompilieren und ihn remote auf dem Emulator zu debuggen, der auf einem anderen Computer gestartet wurde? Ich habe es satt, dass der Emulator ständig die Hälfte der CPU meines Laptops frisst.

zakovyrya
quelle

Antworten:

71

Ich habe den von adb connectcmb 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 localhostBefehl ssh auf die lokale Schnittstelle des Remotecomputers bezieht .

adb deviceszeigte einen neuen Emulator - emulator-5554- und ich konnte ihn so verwenden, als würde er auf meinem lokalen Computer ausgeführt.

Christopher Orr
quelle
1
funktioniert wie ein Zauber, auch von meinem Windows 7-Computer mit Putty SSH-Portweiterleitung. Danke dir.
gsbabil
1
@JimMcKeeth: Öffnen Sie Putty basierend auf der obigen Netzwerkkonfiguration und gehen Sie zu Verbindung> SSH> Tunnel. Fügen Sie nun einen Eintrag mit Source-Port: 5556 und Destination: localhost: 5554 hinzu. Wiederholen Sie dies mit Source-Port: 5557 und Destination: localhost: 5555. Prost!
gsbabil
5
Denken Sie daran, dass Sie dies killall adbauch auf dem Server tun müssen, da der Emulator nicht mehrere Verbindungen akzeptiert und offlinefür den lokalen Computer bestimmt ist.
Henrique de Sousa
Kann es jemand auf Englisch erklären?
Anil GR
21

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

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

  2. Ich habe Port 22 (TCP) in der Windows-Firewall geöffnet. (WinSSHD kann das möglicherweise für Sie tun.)

  3. Ich habe ein virtuelles Konto in der WinSSHD-GUI erstellt.

  4. Ich habe eine neue PuTTY-Verbindung von der Entwicklungsmaschine zur Emulatormaschine hergestellt und sichergestellt, dass ich eine Verbindung herstellen kann.

  5. 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.)

  6. Jetzt habe ich den Emulator auf dem Remote-Computer gestartet und sichergestellt, dass ADB dort nicht ausgeführt wird.

  7. Ich habe ADB auf dem Entwicklungscomputer ( adb kill-serverdann adb start-server) neu gestartet .

  8. adb devicesund der Remote-Emulator wurde als angezeigt emulator-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.

Henrik Heimbuerger
quelle
Hat super funktioniert! Danke für die Details.
Jim McKeeth
1
Schön, aber ich möchte klarstellen: Nach Schritt 4 müssen Sie den Kitt schließen, dann in Schritt 5 wieder öffnen, die Tunnel konfigurieren und die Verbindung wieder herstellen. Schritte 6-8: Starten Sie zuerst den Emulator und dann adb (auf dem Host-Computer). Schritt 9: Möglicherweise möchten Sie adb auf dem Client-Computer neu starten und adb-Geräte eingeben, um sicherzustellen, dass es in Ordnung ist. Regelmäßige DDMS- und Eclipse-Inhalte sollten ebenfalls funktionieren.
Mister Smith
@MisterSmith Sehr gültige Punkte, warum reichen Sie keine Bearbeitung ein? :)
Henrik Heimbuerger
@MisterSmith Können Sie bitte Ihre Antwort bearbeiten, um diesen Kommentar wiederzugeben, der für den Erfolg des Problems sehr wichtig ist. Vielen Dank, ich kann jetzt von meinem Gastcomputer aus eine Verbindung zu meinem Host herstellen.
Meanbunny
20

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:

  • System-A: Windows7-System mit laufendem Android-Emulator
  • System-B: Ubuntu-Server mit installiertem SDK

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

Tunnel Screenshot

Stellen Sie schließlich nach dem Herstellen der SSH-Verbindung eine Verbindung mit adb zu "localhost" auf System-B her:

System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555  device

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

C:\> adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
C:\> adb devices
List of devices attached
3435F6E6035B00EC        device

Beenden Sie als Nächstes den ADB-Server auf System-B

System-B$ adb kill-server

Starten Sie abschließend Ihre SSH-Sitzung in System-B neu und überprüfen Sie sie

System-B$ adb devices
List of devices attached
3435F6E6035B00EC        device
Patrick McKinnon
quelle
Gibt es eine Möglichkeit, dies zu tun, ohne das Android SDK auf System-A zu installieren? (die Windows-Maschine?)
Keith Twombley
Nein, da der ADB-Server und die USB-Treiber auf System-A ausgeführt werden müssen, um mit dem Gerät zu kommunizieren.
Patrick McKinnon
Ich habe dies auch mit einem Setup wie: Windows 7 (mit Emulator) -> Linux (erforderlicher Hop aufgrund des Netzwerks ...) -> OS X mit Eclipse gemacht. Ich kann die Geräte mit 'adb-Geräten' sehen und den Emulator von Eclipse verwenden. Das Problem ist, dass es das Android-Ziel des Emulators nicht erkennt, daher muss ich das Ziel bei jedem Lauf manuell auswählen.
Frank
Wenn Sie einen Kitt für Mac OS X benötigen, finden Sie ihn hier: mac-tools.org/putty-fur-mac-os-x/02/2012 Für mich hat es mit diesem Tool funktioniert.
Bruno Bieri
@PatrickMcKinnon das Ding hat gut funktioniert, aber auf System-B werde ich nicht autorisiert, wenn ich "ADB-Geräte" aufrufe. Auf dem System-B zeigt "adb Geräte", dass es gut funktioniert. Irgendeine Hilfe?
Tejas Sherdiwala
5

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 -F localhost:5554 10000
    hts -F localhost:5555 10001

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 -F 5554 HostEmulator:10000
    htc -F 5555 HostEmulator:10001

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 :

    adb kill-server
    adb start-server
    adb devices

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.

  • Und los geht's.

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.

Shlublu
quelle
2

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.

adb connect <Andro VM IP>
adp tcpip 555

Auf der cmd-Eingabeaufforderung als Administrator ausführen:

netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>

Öffnen Sie den TCP-Port 5555 in der Windows-Firewall.

Dann ab dem zweiten PC ausführen:

adb connect <host ip>
Emirikol
quelle
1

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:

netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>

netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>

Quelle: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ Haftungsausschluss, ich bin der Autor.

Sarpe
quelle
Perfekte Antwort und Artikel! Wenn Sie Genymotion verwenden, verwenden Sie diese Lösung. Der Artikel ist über Windows und Mac geschrieben, aber ich habe lokales Ubuntu und Remote-Ubuntu und alles funktioniert gut. Hat meine Woche gerettet!
Don-Prog
1

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

android.weasel
quelle
Können Sie weitere Details zu dieser Lösung bereitstellen? Ich habe alles getan, was Sie gesagt haben, aber ich habe kein Gerät in "Select Deployment Target" in Android Studio. Ich benutze Genymotion auf dem zweiten Computer.
Don-Prog
@ don-prog Sie sagen nicht über die Befehlszeile, ob es für Sie funktioniert: adb -L tcp:remotehost:1234 devicesWenn 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.
android.weasel
0

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 dass adb --helpein connect <host>:<port>Befehl angezeigt wird . Ich gehe davon aus, dass es dadurch angezeigt wird, adb devicesdass adbBefehle 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.

Chris Boyle
quelle