【问题标题】:Stop adb screenrecord from java从java停止adb screenrecord
【发布时间】:2025-12-03 07:50:01
【问题描述】:

我正在使用 Selendroid 来测试我的应用。 在每个测试开始时,我使用以下函数运行 adb shell screenrecord:

public static Process startScreenRecord(String fileName) throws IOException{
    ProcessBuilder builder = new ProcessBuilder(
            "cmd.exe", "/c", "cd C:\\Users\\user\\Downloads\\adt-bundle-windows-x86_64-20140702\\adt-bundle-windows-x86_64-20140702\\sdk\\platform-tools\\ && adb shell screenrecord /sdcard/" + fileName);
    builder.redirectErrorStream(true);
    Process p = builder.start();
    return p;
}

录制开始,一切正常。在每次测试结束时,我尝试通过以下代码停止记录:

public static void stopScreenRecord(Process p) throws IOException{
    p.destroy();
}

在测试中我使用以下结构:

    Process p = CmdHelper.startScreenRecord("e1.mp4");
    //TestCode
    CmdHelper.stopScreenRecord(p);

问题是视频录制没有停止。 如何在每次测试结束时停止通话录音?

【问题讨论】:

  • 您可能希望使用 adb shell 操作来查找并终止屏幕记录进程本身。注意 android 没有 pkill 或 killall,虽然它现在有 grep。
  • 问题是杀掉进程后视频没有保存。有什么“干净”的方法可以停止该过程以便保存视频?
  • @galvan 你能发布你想出的解决方案吗?你让这个工作了吗?我们遇到了同样的问题。谢谢

标签: java android selenium selendroid


【解决方案1】:

adb shell screenrecord --help 文档说终止它的两种方法是设置时间限制或发送它 ctrl-C。

假设时间限制选项对您不起作用,问题将是如何发送 ctrl-C 或其等效功能。如果您将输出流连接到 ADB 的标准输入并使其保持打开状态,您可能可以向下发送一个 ctrl-c(或者您最终可能会中断 ADB 而不是远程)。

另一个似乎可行的选项是使用 kill 命令发送 SIGINT(这是 ctrl-C 通常执行的操作)而不是 kill 通常发送的 SIGTERM 信号。这应该会让屏幕录制过程认为你按了 ctrl-c。

如果您找到了进程 id,以下似乎可以工作并留下一个视频文件:

adb shell kill -2 [pid number]

其中 2 是 Linux 和 Android 上通常的 SIGINT 编号。

【讨论】:

  • 如何找到screenrecord的processID?
  • 通过管道将 adb shell 的 ps 输入到 grep 中作为进程名称,同时运行 grep 运行在 Android 设备或您的开发机器上更好地支持它。也许有一天android会得到一个pkill
  • @ChrisStratton 你有 ps -ef | 的解决方案吗? grep screenrecord 或者你是怎么做的?我们遇到了类似的问题。