来自命令行的 Android 停止仿真器

这个问题和 如何通过命令行关闭 Android 模拟器是一样的。

然而,在尝试了建议的解决方案后,从第一个答案 adb emu kill没有被证明是成功的。

我正在为一个 Android 应用程序自动化单元测试。我的 bash 脚本在无头机器上运行。它使用 android create avd创建一个 android 设备,并使用 -no-window属性执行 emulator。然后它编译测试项目,使用 adb连接到模拟器,安装项目并执行我的测试。一切都很顺利。

现在我需要终止模拟器进程,就像引用的文章一样,我只能使用 kill -9来做这件事。

Google 教程 从命令行管理 AVD只提到了如何在 GUI 环境中停止模拟器。

感谢你的帮助。

195319 次浏览

也许 adb kill-server对你有帮助?

或者

其中 emulator-5544-模拟器名称。

对于 Linux 用户来说,它将是

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

另一个答案对我来说不起作用(在 Windows 7上) ,但这个答案起作用了:

telnet localhost 5554
kill

为什么不直接做呢

adb reboot bootloader

Adb kill-server 将杀死所有的模拟器并重新启动服务器。

附件设备清单 模拟器 -5584主机 模拟器 -5580主机 模拟器 -5576主机 模拟器 -5572主机 模拟器 -5568主机 模拟器 -5564主机 模拟器 -5560主机

C: 用户管理员 > adb-s 模拟器 -5584 emu kill 错误: 无法连接到 TCP 端口5584: 无法连接到127.0。0.1:5584: 无法建立连接,因为目标机器主动拒绝了它。(10061)

注意: 模拟器的 gui 没有运行,但仍然显示

解决方案:

adb kill-server

使用以下方法启动模拟器:

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

为了停止所有正在运行的模拟器,我们使用以下命令:

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

为了实现自动化,您可以使用任何可以将字符串发送到套接字的脚本或应用程序。我个人喜欢在 Cygwin 下面的 NC (netcat)。正如我之前所说,我是这样使用它的:

$ echo kill | nc -w 2 localhost 5554

(这意味着将“ kill”字符串发送到 localhost 上的端口5554,并在2秒后终止 netcat。)

所有的解决方案都不适合我,我不得不使用 telnet 方式,包括认证:

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

完整的脚本可以从 https://github.com/kullo/android-emulator-tools获得免费许可


更新: 看起来这仍然不能可靠地关闭控制台和 ADB 端口(例如5554,5555)

为了便于阅读,我使用了以下一行代码:

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 {}"

有时候是命令

adb -s emulator-5554 emu kill

不能在我的 CI 服务器或台式机上工作,原因不明。 我认为在 Windows 上可以终止 qemu 进程,就像

Taskkill /IM qemu-system-x86_64.exe /F /T

我可以用:

adb shell reboot -p

如果您不想知道 adb -s emulator-5554 emu kill的设备序列名,那么您可以使用 adb -e emu kill杀死一个模拟器。如果同时运行多个模拟器,这不会造成任何损失,但对于启动和停止单个模拟器进行测试的自动化来说,这是非常有用的。

对 MAC 来说:

  1. 跑步:
ps -ax | grep emulator

这会给你一个广泛的结果,比如:

 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. 第一列(左侧)是要查找的进程 ID (PID)。

  2. 在第一行(顶部)找到 PID。在上面的例子中,它是 6617

  3. 终止这个过程:

kill PID

在我的例子中,命令是:

kill 6617
  1. 通常,杀死第一个进程的数量足以停止模拟器,但是如果这不起作用,您可以:

    试着杀死其他进程。

    5.2用 -9杀死(强制杀死) :

kill -9 PID

如果

 adb kill-server

使用:

 adb emu kill

这会杀死所有的模拟器

如果存在多个模拟器,则使用:

adb -s * emu kill

这个处方可以帮助你一次性杀死所有的模拟器:

  1. 过滤模拟器(因为你可以混合物理和鸸鹋)
  2. 用 ADB ID 杀死所有鸸鹋

这种解决方案的缺点: 如果您的 emu 只是“卡住”,您不能用 adb 命令杀死它,它需要进程杀死。但这种情况很少见。

while [ "`adb devices | grep -Eoh \"emulator-\d{0,4}\" | wc -l | tr -d ' '`" != "0" ]; do
echo "Connected emulators:"
adb devices | grep -Eoh "emulator-\d{0,4}"


for emulator in $(adb devices | grep -Eoh "emulator-\d{0,4}")
do
echo "Killing the emulator: $emulator"
adb -s "$emulator" emu kill | true
done


sleep 10;
done
echo "All emus has been killed"

在 Windows10上,使用 Android Studio 2021.1.1补丁3,adb-s 模拟器 -5554 emu kill 命令无法工作,无法识别 adb。

但是这里是使用工具/设备管理器的解决方案。只需选择活动模拟器并单击 x 停止它。

Killing the selected emulator

在 Linux 上,当进程无响应时,我可以终止模拟器的唯一方法是使用以下命令:

kill -9 `pidof adb`

它找到 adb的进程 ID 并向其发送一个 kill -9信号。