You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python+ADB录制Android屏幕时进程阻塞问题求助

问题分析与修复方案

你的代码核心问题有两个:

  1. record() 函数里调用了 provaprocesso.communicate(),这个方法会阻塞直到子进程结束,导致程序卡在录制启动步骤,后面的time.sleep(3)和stoprecord()完全没机会执行。
  2. stoprecord() 里用 ["^C"] 发送中断信号的方式无效,^C 是终端键盘输入信号,无法通过subprocess直接发送。

还有两个细节漏洞:

  • 命令字符串拼接时缺少空格,"shell" + "screenrecord" 会变成shellscreenrecord(你说录制已启动,可能实际代码有空格,但建议用列表传参彻底避免这类错误)。
  • comando 变量未定义,需要预先赋值为你的Android设备序列号(可通过adb devices查看)。

修复后的完整代码

import subprocess
import time
import signal

# 替换成你的设备序列号(adb devices命令可查)
comando = "your_device_serial"

# 全局变量保存录制进程对象,供stoprecord调用
record_process = None

def record():
    global record_process
    # 用列表形式传参,避免shell=True和字符串拼接错误
    cmd = ["adb", "-s", str(comando), "shell", "screenrecord", "/sdcard/video.mp4"]
    # 启动进程但不等待结束,直接继续执行后续逻辑
    record_process = subprocess.Popen(cmd)

def stoprecord():
    global record_process
    if record_process:
        # 发送SIGINT信号,模拟Ctrl+C中断录制
        record_process.send_signal(signal.SIGINT)
        # 等待进程完全退出,避免拉取文件时未写入完成
        record_process.wait()
    
    # 拉取视频到当前目录
    subprocess.run(["adb", "-s", str(comando), "pull", "/sdcard/video.mp4"], check=True)
    # 删除设备端的视频文件
    subprocess.run(["adb", "-s", str(comando), "shell", "rm", "/sdcard/video.mp4"], check=True)

# 执行流程
record()
time.sleep(3)
stoprecord()

关键改进点

  • 移除communicate(),改用全局变量保存Popen进程对象,让程序能继续执行等待和停止逻辑。
  • 用send_signal(signal.SIGINT)代替无效的^C命令,正确中断adb屏幕录制进程。
  • 改用列表形式传递命令参数,避免字符串拼接的空格问题,同时无需shell=True,更安全。
  • 增加record_process.wait(),确保录制进程完全退出后再拉取文件,避免文件损坏。
  • 加入check=True,adb命令执行失败时会抛出异常,方便排查问题。

内容的提问来源于stack exchange,提问作者WhoamI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:23:35