Frage Remote-Debugging mit Android-Emulator


Ist es möglich, den Code / kompilieren Android-Anwendung auf einem Rechner zu schreiben und es aus der Ferne auf dem Emulator auf einem anderen zu debuggen? Ich bin es leid, dass der Emulator ständig die Hälfte der CPU meines Laptops isst.


76
2017-11-18 07:08


Ursprung


Antworten:


Ich habe es vorher nicht versucht (oder sogar bemerkt) adb connect command, dass cmb erwähnt, aber ich kann bestätigen, dass die Weiterleitung der TCP-Ports selbst - wie über SSH - funktioniert gut.

Der Emulator überwacht zwei TCP-Ports pro Instanz: 5554 für die Telnet-Schnittstelle und 5555 für die Steuerkommunikation mit Tools wie DDMS. So könnte man wohl nur mit Forwarding Port 5555 durchkommen (obwohl ich es bisher bei beiden bisher nur probiert habe). Jeder nachfolgende Emulator nimmt das nächste verfügbare Tupel mit geraden und ungeraden Portnummern (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 beim Start einen lokalen Adb-Server zu benachrichtigen; Daher muss ADB neu gestartet werden, damit die lokalen 5554 + -Ports überprüft werden können.

Notiere dass der localhost im Befehl ssh bezieht sich auf die lokale Schnittstelle der Fernbedienung Maschine.

adb devices zeigte einen neuen Emulator - emulator-5554 - und ich könnte es benutzen, als würde es auf meinem lokalen Rechner laufen.


61
2017-12-19 01:30



Hier ist, wie ich es unter Windows gelöst habe. Ich habe Christopher's Führung ziemlich gut gefolgt, aber ich kann nicht bearbeiten, also muss eine neue Antwort genügen.

Das Problem, das ich hatte, war, dass sowohl ADB als auch der Emulator nur auf 127.0.0.1 und nicht auf 0.0.0.0 für mich hörten. Sonst hätte ich gebraucht TCPMon. Ich denke, das 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 installierte WinSSHD auf dem Computer, auf dem der Emulator ausgeführt wird. (Ich glaube, es sollte auch mit freeSSHd funktionieren, aber ich konnte dort kein Login bekommen.)

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

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

  4. Ich erstellte eine neue PuTTY-Verbindung vom Entwicklungscomputer zum Emulator und stellte sicher, dass ich eine Verbindung herstellen konnte.

  5. Dann habe ich in PuTTY Tunneling eingerichtet: Verbindung -> SSH -> Tunnel

    Source port: 5554
    Destination: localhost:5554
    Type: Local/Auto

    Source port: 5555
    Destination: localhost:5555
    Type: Local/Auto 

    (Verbinden und halten Sie PuTTY offen, um den Tunnel zu erhalten.)

  6. Jetzt habe ich den Emulator auf dem Remote-Rechner hochgefahren und dafür gesorgt, dass ADB nicht dort läuft.

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

  8. adb devices und der Remote-Emulator erschien als emulator-5554 device. Ich konnte meine App jetzt direkt aus Eclipse / ADT bereitstellen und ausführen, wobei der Emulator unter Virtuelle Geräte wie ein lokaler Emulator angezeigt wurde.


19
2018-05-08 00:15



Ich weiß, dass diese Frage wirklich alt ist, aber ich habe das Problem etwas anders gelöst, und ich brauchte eine Weile, um diese triviale Lösung herauszufinden.

Normalerweise benutze ich einen Windows7 PC oder Laptop (abhängig davon, wo ich arbeite) als Frontend, weil ich die GUI mag, aber ich bevorzuge es, all meine Editier- / Kompilier- / Debugging-Funktionen auf einem kopflosen Ubuntu-Server durchzuführen Befehlszeilenleistung, die es bereitstellt. Mein Ziel ist es, jedes Windows-System so viel wie möglich zu einem Thin-Client zu machen, ohne zusätzliche Dienste (wie sshd) oder Firewall-Lücken.

Also hier ist das Senario:

  • System-A: Windows7-System mit Android-Emulator läuft
  • System-B: Ubuntu-Server mit installiertem SDK

Das oben beschriebene Problem besteht darin, dass der Emulator in System-A an localhost und nicht an die externe Ethernet-Schnittstelle gebunden ist, sodass adb im System-B nicht auf den Emulator auf System-A zugreifen kann. Alles, was Sie tun müssen, ist die Remote-Portweiterleitung in PuTTY für Ihre SSH-Verbindung zu System-B einzurichten. Der Trick besteht darin, das Optionsfeld "Remote" zu aktivieren, wenn Sie die beiden Tunnel so erstellen, dass die Tunnelrichtung umgekehrt ist (Tunneln von dem Server, auf dem Sie sich anmelden, auf den Client, von dem aus Sie sich anmelden).

tunnel screenshot

Verbinden Sie sich nach dem Aufbau der SSH-Verbindung mit adb mit "localhost" auf System-B:

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 eine triviale Angelegenheit, zu einem anderen Windows-System zu wechseln, wenn Sie Ihren Laptop mitnehmen und Kaffee trinken wollen.

Indem Sie auch Port 5037 auf die gleiche Weise tunneln, können Sie Ihre AdB-Server-Verbindung sogar weiterleiten, so dass Sie ein echtes Android-Gerät über USB auf System-A anschließen und Bilder von System-B dorthin laden können. Damit dies funktioniert, müssen Sie sicherstellen, dass der adb-Server auf System-A läuft und nicht auf System-B läuft, 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

Als nächstes kill den adb-Server auf System-B

System-B$ adb kill-server

Schließlich, starten Sie Ihre SSH-Sitzung zu System-B neu und überprüfen Sie

System-B$ adb devices
List of devices attached
3435F6E6035B00EC        device

16
2018-04-08 03:48



Ich habe einen einfachen Weg gefunden, dies zu tun, wenn sich Ihre beiden Maschinen im selben privaten Netzwerk befinden und daher keine SSH-Verschlüsselung benötigen (was häufig der Fall ist). Dies kann hilfreich sein, da ein SSH-Tunnel ziemlich lang und schwierig zu installieren sein kann. Zum Beispiel kann die Installation eines SSH-Daemon unter Cygwin / Windows zum ersten Mal dazu führen, aufzugeben (nun, ich gab auf).

Unter Windows muss Cygwin mit dem Paket installiert werden httptunnel. Dies muss unter Linux / httptunnel auch, 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 Rechner (nennen wir es mal) HostEclipse)

  • Öffnen Sie ein Cygwin-Terminal auf jeder Maschine und

  • Auf HostEmulator, geben Sie die folgenden cygwin-Befehle ein:

    hts -F localhost:5554 10000
    hts -F localhost:5555 10001
    

hts meint HTTP-Tunnelserver.

Diese beiden Befehle erzeugen zwei Halbbrücken, die auf die Ports 10001 und 10001 warten und die I / O dieser Ports an die lokalen Ports 5554 und 5555 umleiten, die die vom Emulator verwendeten Ports sind (eigentlich der erste gelaunte Emulator). Wenn Sie mehrere davon ausführen, verwenden Sie höhere Portnummern, wie in anderen Antworten auf dieser Seite zu sehen ist.

  • Auf HostEclipse, gib diese ein:

    htc -F 5554 HostEmulator:10000
    htc -F 5555 HostEmulator:10001
    

htc meint HTTP-Tunnel-Client.

Diese Befehle erzeugen die fehlenden Halbbrücken. Sie hören die lokalen Ports 5554 und 5555 und leiten die E / A dieser Ports zu den Halbbrücken um, auf denen wir sie erstellt haben HostEmulatorkurz bevor.

  • Dann, immer noch HostEclipse, geben Sie diese drei Befehle ein:

    adb kill-server
    adb start-server
    adb devices
    

Dies startet adb neu, da ansonsten der Remote-Emulator nicht erkannt wird. Es muss beim Start etwas gescannt werden. Und dann listet es die Geräte (die verfügbaren Emulatoren) nur zur Überprüfung auf.

  • Und da gehst du. 

Sie können mit Ihrem Remote-Emulator so arbeiten, als wäre er lokal. Sie müssen die Cygwin-Terminals auf beiden Maschinen offen halten, sonst würden Sie die von Ihnen erstellten Halbbrücken zerstören.

Ich habe hier den Port 10000 und 10001 für den Austausch von Maschinen / Maschinen benutzt, aber natürlich können Sie andere Ports verwenden, solange sie nicht bereits benutzt werden.


4
2017-08-24 22:04



Ein Entwicklertelefon ist weniger teuer als ein zusätzlicher Computer und kann remote debuggt werden. Es hat den zusätzlichen Vorteil, alle optionalen Sensoren zu haben, die der Emulator standardmäßig nicht anzeigt.

Ich empfehle dringend, ein Entwickler-Handy zum Testen zu bekommen.


2
2017-11-21 15:55



Meine Lösung für Windows + AndroVM (die einen Host-only-Adapter benötigt), als mein ssh-Dienst nicht gestartet werden konnte. Daher ist keine zusätzliche Software erforderlich.

adb connect <Andro VM IP>
adp tcpip 555

Bei cmd-Eingabeaufforderung als Admin 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, vom zweiten PC aus:

adb connect <host ip>

2
2018-06-05 08:50



Ich habe keine zweite Maschine mit dem SDK zur Hand, aber ich stelle fest, dass die Listen Ports des Emulators (Standard 5554, 5555) zuhören 0.0.0.0d.h. von entfernten Maschinen erreichbar, und das adb --help zeigt ein connect <host>:<port> Befehl. Ich nehme an, das würde es auftauchen lassen adb devices damit adb Befehle arbeiten daran. Versuchen Sie für Eclipse "Run / Run Configurations ..." und setzen Sie das Ziel auf Manuell. Das gibt Ihnen einen "Geräte-Chooser", von dem ich vermute, dass er einen Remote-Emulator enthalten würde, wenn adb mit ihm verbunden ist. Einen Versuch wert.


0
2017-11-18 14:38



Keine der vorgeschlagenen Lösungen funktionierte für mich. Ich habe mit der Lösung von Emirikol begonnen und verfeinert, da mit der neuen Android-API> 21 der Emulator offline erschien und ich zu den Genymotion-Einstellungen gehen musste und den Android SDK-Pfad leer ließ. Und von der Kommandozeile aus:

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/ Disclaimer, ich bin der Autor.


0
2017-10-02 17:25



Wenn Sie adb ausführen, startet es eine Serverkopie von sich selbst, wenn nicht bereits eine läuft. Sie können diese Kopie selbst auf dem Gerät mit dem Gerät starten, und seit sdk 4.3 können Sie ihm die Option -a geben, den Server anzuweisen, auf entfernte Maschinen zu warten. Tun Sie das mit dem folgenden Befehl, der nicht beendet wird:

adb -a -P 5037 Server nodaemon

Stellen Sie ADB_SERVER_SOCKET auf dem Computer, auf dem Sie das Gerät verwenden möchten, in einer Umgebungsvariablen auf tcp: xxxx: 5037 ein (oder geben Sie jedem adb-Aufruf mit der Option -L denselben Wert), wobei xxxx die IP-Adresse oder der Hostname von Maschine mit den Geräten und 5037 stimmt mit dem Port überein, den Sie im obigen Befehl angegeben haben.

Wir verwenden dies, um etwa 100 Emulatoren, die auf 3 Maschinen verteilt sind, einem Rechner, der parallele Tests durchführt, und Entwicklern, die reale Geräte remote nutzen möchten, zu ermöglichen.

Sie können Ports zum und vom Emulator mit adb forward und adb reverse weiterleiten, und sie werden auf dem Computer mit den Geräten angezeigt.


0
2018-06-21 05:41