Android Stop Emulator über die Befehlszeile

73

Diese Frage ist identisch mit dem Herunterfahren des Android-Emulators über die Befehlszeile .

Nach dem Versuch der vorgeschlagenen Lösung aus der ersten Antwort adb emu killhat sich für mich jedoch nicht als erfolgreich erwiesen.

Ich automatisiere Unit-Tests für eine Android-Anwendung. Mein Bash-Skript läuft auf einem kopflosen Computer. Es erstellt ein Android-Gerät mit android create avdund führt es emulatormit dem -no-windowAttribut aus. Anschließend wird das Testprojekt kompiliert, eine Verbindung zum Emulator hergestellt adb, das Projekt installiert und meine Tests ausgeführt. Das alles funktioniert gut.

Jetzt muss ich den Emulatorprozess beenden und genau wie der referenzierte Beitrag kann ich dies nur mit tun kill -9.

Im Google-Tutorial Verwalten von AVDs über die Befehlszeile wird nur erwähnt, wie Emulatoren in einer GUI-Umgebung gestoppt werden.

Jede Hilfe wird geschätzt.

jsjrobotics
quelle

Antworten:

170

Verwenden Sie adb kill-server. Es sollte helfen. oder

adb -s emulator-5554 emu kill, wo emulator-5554ist der Emulatorname.

Für Ubuntu- Benutzer habe ich einen guten Befehl gefunden, um alle laufenden Emulatoren zu stoppen (Dank an @uwe ).

adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done
Sergey Shustikov
quelle
3
adb kill-server stoppt adb, stoppt aber nicht den Emulatorprozess. Und die Emu-Kill-Anweisung gibt immer den Emulator zurück, der nicht gefunden wurde
jsjrobotics
Emulator nicht gefunden? Glaube niemals daran. Wenn Sie den Emulator starten, haben Sie einen Emulator. Nicht? Versuchen Sie, einen anderen Port zu emulieren. Die Anzahl der Ports besteht aus dem obigen Link.
Sergey Shustikov
5
Weder arbeiten an OSX mit den neuesten verfügbaren SDKS zu diesem Zeitpunkt
siehe
7
adb -s emulator-5554 emu killfährt den Emulator herunter, aber der Befehl wird nicht beendet und für immer blockiert: /
Simon Warta
1
Für alle, die davon verwirrt waren, können Sie den Emulatornamen mithilfe von finden adb devices.
nhouser9
29

Um alle laufenden Emulatoren zu stoppen, verwenden wir diesen Befehl:

adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done
uwe
quelle
11

FÜR MAC:

  1. Lauf:
ps -ax | grep emulator 

Das gibt Ihnen ein breiteres Ergebnis wie:

 6617 ??         9:05.54 /Users/nav/Library/Android/sdk/emulator/qemu/darwin-x86_64/qemu-system-x86_64 -netdelay none -netspeed full -avd Nexus_One_API_29
 6619 ??         0:06.10 /Users/nav/Library/Android/sdk/emulator/emulator64-crash-service -pipe com.google.AndroidEmulator.CrashService.6617 -ppid 6617 -data-dir /tmp/android-nav/
 6658 ??         0:07.93 /Users/nav/Library/Android/sdk/emulator/lib64/qt/libexec/QtWebEngineProcess --type=renderer --disable-accelerated-video-decode --disable-gpu-memory-buffer-video-frames --disable-pepper-3d-image-chromium --enable-threaded-compositing --file-url-path-alias=/gen=/Users/nav/Library/Android/sdk/emulator/lib64/qt/libexec/gen --enable-features=AllowContentInitiatedDataUrlNavigations --disable-features=MacV2Sandbox,MojoVideoCapture,SurfaceSynchronization,UseVideoCaptureApiForDevToolsSnapshots --disable-gpu-compositing --service-pipe-token=15570406721898250245 --lang=en-US --webengine-schemes=qrc:sLV --num-raster-threads=4 --enable-main-frame-before-activation --service-request-channel-token=15570406721898250245 --renderer-client-id=2
 6659 ??         0:01.11 /Users/nav/Library/Android/sdk/emulator/lib64/qt/libexec/QtWebEngineProcess --type=renderer --disable-accelerated-video-decode --disable-gpu-memory-buffer-video-frames --disable-pepper-3d-image-chromium --enable-threaded-compositing --file-url-path-alias=/gen=/Users/nav/Library/Android/sdk/emulator/lib64/qt/libexec/gen --enable-features=AllowContentInitiatedDataUrlNavigations --disable-features=MacV2Sandbox,MojoVideoCapture,SurfaceSynchronization,UseVideoCaptureApiForDevToolsSnapshots --disable-gpu-compositing --service-pipe-token=--lang=en-US --webengine-schemes=qrc:sLV --num-raster-threads=4 --enable-main-frame-before-activation --service-request-channel-token=  --renderer-client-id=3
10030 ttys000    0:00.00 grep emulator
  1. Die erste (linke) Spalte ist die gesuchte Prozess-ID (PID).

  2. Suchen Sie die erste PID (im obigen Beispiel ist es 6617).

  3. Diesen Prozess erzwingen:

kill -9 PID

In meinem Fall lautet der Befehl:

kill -9 6617
  1. Normalerweise wird der erste Prozess so beendet, dass der Emulator gestoppt wird. Wenn dies jedoch nicht funktioniert, versuchen Sie auch, andere Prozesse zu beenden.
Navid Vafaei
quelle
9

Die andere Antwort hat bei mir nicht funktioniert (unter Windows 7). Aber das hat funktioniert:

telnet localhost 5554
kill
Zenadix
quelle
1
aber bevor die Telnet-Funktion über Systemsteuerung> Programme und Funktionen> Windows-Funktionen
ein-
killscheint kein Befehl in Emulatoren zu sein, auf denen Android 9 ausgeführt wird, möglicherweise auch früher
Vanquish46,
8

Warum nicht einfach tun

adb reboot bootloader

quelle
Dies funktionierte schließlich für mich, vielleicht nachdem ich die anderen oben genannten Befehle
aufgerufen hatte
Ja wirklich! Ich dachte, wir können den Android-Emulator nicht über den Befehl 'reboot' neu starten. Welche Version verwenden Sie?
Rida Shamasneh
6

Manchmal der Befehl

adb -s emulator-5554 emu kill

funktionierte aus unbekannten Gründen nicht auf meinen CI-Servern oder Desktops. Ich denke unter Windows ist es in Ordnung, den Prozess von Qemu zu beenden, genau wie

Taskkill /IM qemu-system-x86_64.exe /F /T
Huiyang Shan
quelle
2
TaskkillBefehl funktionierte für mich. Vielen Dank. Es ist unglaublich, dass wir uns noch mit solchen Dingen befassen müssen.
Panos Gr
Ich habe alle Lösungen ausprobiert, die einzige, die für mich funktioniert hat
Mohammad Elsayed
5

Ich kann es schließen mit:

adb shell reboot -p
Hugo y
quelle
1

Keine der Lösungen hat bei mir funktioniert. Ich musste den Telnet-Weg einschließlich der Authentifizierung gehen:

AUTH=$(cat "$HOME/.emulator_console_auth_token")

expect << EOF
spawn telnet localhost 5554
expect "OK"
send   "auth $AUTH\r"
expect "OK"
send   "kill\r"
expect "OK"
send   "exit\r"
EOF

Das vollständige Skript erhalten Sie mit einer kostenlosen Lizenz unter https://github.com/kullo/android-emulator-tools


Update: Es sieht so aus, als ob dies die Konsole und die ADB-Ports immer noch nicht zuverlässig schließt (z. B. 5554,5555).

Simon Warta
quelle
1

Ich benutze diesen Einzeiler, der zur besseren Lesbarkeit in mehrere Zeilen unterteilt ist:

adb devices |
 perl -nle 'print $1 if /emulator-(\d+).device$/' |
 xargs -t -l1 -i bash -c "
   ( echo auth $(cat $HOME/.emulator_console_auth_token) ;
     echo kill ;
     yes ) |
   telnet localhost {}"
android.weasel
quelle
1

Wenn Sie den Seriennamen Ihres Geräts nicht kennen müssen adb -s emulator-5554 emu kill, können Sie einfach adb -e emu killeinen einzelnen Emulator beenden. Dies wird nichts töten, wenn mehr als ein Emulator gleichzeitig ausgeführt wird. Es ist jedoch nützlich für die Automatisierung, bei der Sie einen einzelnen Emulator für einen Test starten und stoppen.

Astyer
quelle
0

adb kill-server beendet alle Emulatoren und startet den Server sauber neu.

chrisjhebert1973
quelle
5
Tötet oder startet keinen Emulator für mich neu.
Simon Warta
6
adb kill-server tötet den Server. Emulatoren werden nicht getötet.
android.weasel
es funktionierte bei mir ohne angeschlossenes USB-Kabel. Vielen Dank!
dokam_scotland
0

Liste der angeschlossenen Geräte Emulator-5584 Host-Emulator-5580 Host-Emulator-5576 Host-Emulator-5572 Host-Emulator-5568 Host-Emulator-5564 Host-Emulator-5560 Host

C: \ Benutzer \ Administrator> adb -s emulator-5584 emu kill error: Verbindung zum TCP-Port 5584 konnte nicht hergestellt werden: Verbindung zum 127.0.0.1:5584 kann nicht hergestellt werden: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer dies aktiv abgelehnt hat. (10061)

HINWEIS: Die Benutzeroberfläche des Emulators läuft nicht, wird aber weiterhin angezeigt

LÖSUNG:

adb kill-server

Starten Sie den Emulator mit:

emulator.exe -netdelay none -netspeed full -avd Nexus_5X_API_19

Ich hoffe, dies wird dir helfen!

Gopal Choudhary
quelle
0

Um dies zu automatisieren, können Sie jedes Skript oder jede App verwenden, die eine Zeichenfolge an einen Socket senden kann. Ich persönlich mag nc (netcat) unter cygwin. Wie ich schon sagte, benutze ich es so:

$ echo kill | nc -w 2 localhost 5554

(Dies bedeutet, dass eine "kill" -String an den Port 5554 auf localhost gesendet und netcat nach 2 Sekunden beendet wird.)

naveed148
quelle