So führen Sie ADB über „WLAN“ (eigentlich auf demselben PC) für emulierte Geräte aus

Ich versuche, adb über 'wifi' für mein emuliertes Gerät zu verwenden. Ich emuliere ein Gerät auf meinem Computer und wollte Android Studio verwenden, um eine APK an es zu senden, aber über die Netzwerkbuchsen, nicht über emulierten USB. Ich weiß, dass in Android Studio alles sofort einsatzbereit ist, aber ich muss es auf diese Weise tun

Ich folge diesem Tutorial: https://developer.android.com/studio/command-line/adb.html#wireless

Ich fange damit an

~/Android/Sdk/emulator$ ./emulator -avd Pixel_XL_API_27

Dann sehe ich, dass USB-Debugging aktiviert ist. Ich tue es dann

./adb tcpip 5555
restarting in TCP mode port: 5555

Beachten Sie, dass . /adb tcpip 5555ist willkürlich. Ich habe nicht einmal angegeben, welches Gerät bei 5555 neu gestartet und verbunden werden soll. Was wäre, wenn ich 2 Emulatoren laufen hätte?

Ich sollte jetzt für ein normales USB-Gerät den Stecker ziehen, aber dann gehe ich zu den Entwickleroptionen in meinem emulierten Telefon und deaktiviere das USB-Debugging.

Ich sehe auch, dass die IP-Adresse in den Systemeinstellungen der Telefonanlage emuliert wird192.168.232.2

dann lande ich bei:

./adb connect 192.168.232.2
unable to connect to 192.168.232.2:5555: Connection timed out

Das habe ich auch gemacht:

./adb devices 
List of devices attached
emulator-5554   device

./adb connect 192.168.232.2:5554
unable to connect to 192.168.232.2:5554: Connection timed out

AKTUALISIEREN:

Laut Android Tutorial on ADB läuft auf meinem Computer ein Server auf Port 5037. Das Android-Gerät (in diesem Fall mein Emulator) führt einen Daemon aus und mein adb-Skript in Sdk/platform-tools ist ein Client. Wenn ich einen Client in meiner virtuellen Maschine ausführen möchte, muss ein Server darauf laufen. Aber stattdessen kann ich einfach den 5037-TCP-Port von der VM an den 5037-TCP-Port des Hostcomputers weiterleiten. Ich habe es mit tcptunnel gemacht , indem ich Folgendes gemacht habe:

./tcptunnel --local-port=5037 --remote-host=192.168.122.1 --remote-port=5037 --stay-alive

Wenn ich dann adb auf meiner VM ausführe, wird es eine Verbindung zum adb-Daemon auf meinem Hostcomputer herstellen, der mit dem adb-Server meines Emulators kommunizieren wird. Wenn ich adb devicesdie VM ohne die TCP-Weiterleitung ausführe, versucht sie, einen neuen Server zu starten. Wenn ich diesen Server töte und th tcpforwarded öffne und es erneut mache, versucht er nicht, einen neuen Server zu erstellen. Das ist ein gutes Zeichen. TCPtunnel gibt mir jedoch Folgendes:

build_tunnel: connect(): Connection refused

Etwas blockiert die Verbindung

UPDATE 2:

Es stellt sich heraus, dass tcptunnel nicht erforderlich ist, da adbes die HOption gibt, mit der ich die IP angeben kann, auf der der Server läuft. Ich weiß jedoch nicht, ob es in Android Studio möglich ist, dies anzugeben. Wie auch immer:

./adb -H 192.168.122.1 devices
List of devices attached
* cannot start server on remote host
error: cannot connect to daemon at tcp:192.168.122.1:5037: Connection refused
Können Sie mir sagen, ob Sie es mit einem physischen Gerät oder einem Emulator in Ihrem Betriebssystem zu tun haben?
@AbdelhafidMadoui ist ein Emulator im selben Betriebssystem
Was ist also falsch an dem Befehl adb -s emulator-5554 shell zum Beispiel? Warum WLAN?
@AbdelhafidMadoui Ich muss in einer VM programmieren. Ich kann jedoch keinen neuen Emulator innerhalb dieser VM starten. Stattdessen möchte ich den Emulator parallel zur VM starten und die App über TCP übergeben
@GuerlandoOCs: OK, der Emlator wird also vom Hauptbetriebssystem gestartet und Sie möchten von der VM aus darauf zugreifen? Richtig? Welche VM-Software verwenden Sie?
@AbdelhafidMadoui Ich verwende virt-manager, es verwendet kvm mit SPICE

Antworten (1)

Ich habe vergessen, dass sich der adb-Daemon an bindet localhost, und ich habe versucht, von darauf zuzugreifen 192.168.122.x.

Mit socatkonnte ich den ADB-Client von meiner VM auf den ADB-Daemon auf meinem Host-Rechner umleiten, der eine Verbindung mit dem ADB-Server (meinem emulierten Telefon) herstellte.

Meine Hostmaschine war 192.168.122.1von der virtuellen Maschine aus erreichbar, aber die war an oder adb daemongebunden . Ich habe gerade:127.0.0.1localhost

#on host machine:
socat tcp-listen:5037,bind=192.168.122.1,reuseaddr,fork tcp:localhost:5037

#on virtual machine:
socat tcp-listen:5037,bind=localhost,reuseaddr,fork tcp:192.168.122.1:5037

Stellen Sie sicher, dass Sie den Adb-Server auf der virtuellen Maschine beenden /path/to/android/sdk/platform-tools/adb kill-server. Der ADB-Server versucht immer, sich zu binden, 5037wenn nichts da ist. Wenn also socat bereits auf beiden Seiten adb serverläuft und das auf dem hostMachie läuft, stellt es beim Starten von Android Studio auf der VM automatisch eine Verbindung zum externen Adb-Server her stellt eine Verbindung zu Ihrem emulierten Telefon her.

Zum Testen benötigen Sie kein Android Studio auf der virtuellen Maschine. Sie können einfach /path/to/android/sdk/platform-tools/adb devicesauf der virtuellen Maschine sehen, ob socat sie an den adb-Daemon auf dem Host umleitet, der das emulierte Telefon auflistet.