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 上都没有使用最新的可用 sdks adb -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 工具 )

命令行创建Android模拟器

我无法从 android studio 构建或运行我的颤振应用程序,但它可以从命令行运行

markdown Android模拟器命令行

如何在命令行中使用选项创建 android 模拟器?