Android 从命令行停止模拟器
Posted
技术标签:
【中文标题】Android 从命令行停止模拟器【英文标题】:Android Stop Emulator from Command Line 【发布时间】:2013-12-07 22:53:45 【问题描述】:此问题与How to shut down android emulator via command line 相同。
但是,在尝试第一个答案 adb emu kill
中的建议解决方案后,我并没有证明是成功的。
我正在为一个 android 应用程序自动进行单元测试。我的 bash 脚本在无头机器上运行。它使用android create avd
创建一个android 设备并使用-no-window
属性执行emulator
。然后它编译测试项目,使用adb
连接到模拟器,安装项目并执行我的测试。这一切都很好。
现在我需要终止模拟器进程,就像引用的帖子一样,我只能使用kill -9
来执行此操作。
Google 教程Managing AVDs from the Command Line 仅提及如何在 GUI 环境中停止模拟器。
感谢任何帮助。
【问题讨论】:
【参考方案1】:adb kill-server
可能对你有帮助吗?
或
adb -s emulator-5554 emu kill
,其中emulator-5544
- 模拟器名称。
对于 Linux 用户,它将是
adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done
【讨论】:
adb kill-server 停止 adb 但不停止模拟器进程。并且 emu kill 语句总是返回 emulator not found 没有找到模拟器?永远不要相信这一点。如果你启动模拟器 - 你有模拟器。没有?尝试杀死另一个端口的模拟器。端口数包含在上面的链接中。 目前在 osx 上都没有使用最新的可用 sdksadb -s emulator-5554 emu kill
确实关闭了模拟器,但命令不会终止并永远阻塞:/
对于任何对此感到困惑的人,您可以使用adb devices
找到模拟器名称。【参考方案2】:
这个脚本可以帮助你一次杀死所有模拟器:
-
过滤模拟器(因为您可以混合使用物理和鸸鹋)
按 ADB id 杀死所有鸸
这个解决方案的缺点:如果你的鸸鹋只是“卡住”了,你不能用 adb 命令杀死它,它需要进程杀死。但这种情况非常罕见。
while [ "`adb devices | grep -Eoh \"emulator-\d0,4\" | wc -l | tr -d ' '`" != "0" ]; do
echo "Connected emulators:"
adb devices | grep -Eoh "emulator-\d0,4"
for emulator in $(adb devices | grep -Eoh "emulator-\d0,4")
do
echo "Killing the emulator: $emulator"
adb -s "$emulator" emu kill | true
done
sleep 10;
done
echo "All emus has been killed"
【讨论】:
【参考方案3】:对于 MAC:
-
运行:
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
第一(左)列是您要查找的进程 ID (PID)。
找到第一个 PID(在上面的例子中,它是 6617)。
强制终止该进程:
kill PID
在我的例子中,命令是:
kill 6617
-
通常,杀死第一个进程足以停止模拟器,但如果这不起作用,请尝试杀死其他进程。
更新:
感谢@V.S.建议:将kill -9
改为kill
【讨论】:
不要使用 -9 杀死模拟器。正常kill
就足够了。 -9
使进程崩溃并跳过所有清理,这可能会导致问题。【参考方案4】:
如果
adb kill-server
不起作用。使用:
adb emu kill
这会杀死所有的模拟器
如果存在多个模拟器,则使用:
adb -s * emu kill
【讨论】:
【参考方案5】:如果您不想知道adb -s emulator-5554 emu kill
的设备序列名,那么您可以使用adb -e emu kill
杀死单个模拟器。如果您同时运行多个模拟器,这不会杀死任何东西,但它对于您启动和停止单个模拟器进行测试的自动化很有用。
【讨论】:
【参考方案6】:我可以关闭它:
adb shell reboot -p
【讨论】:
【参考方案7】:有时是命令
adb -s emulator-5554 emu kill
由于未知原因,无法在我的 CI 服务器或桌面上运行。 我觉得在windows上杀掉qemu的进程就可以了,就像
Taskkill /IM qemu-system-x86_64.exe /F /T
【讨论】:
【参考方案8】:我使用这个单行,为了便于阅读,分成几行:
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 "
【讨论】:
【参考方案9】:没有一个解决方案对我有用。我不得不采用包括身份验证在内的 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)
【讨论】:
【参考方案10】:要自动执行此操作,您可以使用任何可以将字符串发送到套接字的脚本或应用程序。我个人喜欢cygwin下的nc(netcat)。正如我之前所说,我是这样使用它的:
$ echo kill | nc -w 2 localhost 5554
(即向localhost的5554端口发送“kill”字符串,2秒后终止netcat。)
【讨论】:
【参考方案11】:要停止所有正在运行的模拟器,我们使用以下命令:
adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done
【讨论】:
【参考方案12】:附加设备列表 模拟器 5584 主机 模拟器 5580 主机 模拟器 5576 主机 模拟器 5572 主机 模拟器 5568 主机 模拟器 5564 主机 emulator-5560 主机
C:\Users\Administrator>adb -s emulator-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
希望对你有帮助!
【讨论】:
【参考方案13】:adb kill-server 将杀死所有模拟器并重新启动服务器干净。
【讨论】:
不会为我杀死或重新启动任何模拟器。 adb kill-server 杀死服务器,它不会杀死模拟器。 它在没有连接 USB 电缆的情况下对我有用。谢谢!【参考方案14】:为什么不这样做
adb reboot bootloader
【讨论】:
这最终对我有用,可能是在调用上述其他命令之后 真的!我以为我们无法通过'reboot'命令重新启动android模拟器你使用的是哪个版本?【参考方案15】:另一个答案对我不起作用(在 Windows 7 上)。但这有效:
telnet localhost 5554
kill
【讨论】:
但在 Telnet 功能需要通过控制面板 > 程序和功能 > 打开或关闭 Windows 功能 > Telnet 客户端激活之前kill
似乎不是运行 Android 9 的模拟器中的命令,也可能更早以上是关于Android 从命令行停止模拟器的主要内容,如果未能解决你的问题,请参考以下文章
如何从命令行设置 android 仪器测试的 vm heapsize
Android 命令行工具Android 命令行工具简介 ( 官方文档 | SDK 命令行工具 | SDK 构建工具 | SDK 平台工具 | 模拟器工具 | Jetifier 工具 )