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

ProcessBuilder执行adb命令报no closing quote错误如何修复

问题根因

报错核心是String.split(" ")拆分命令的逻辑完全不符合命令行参数的解析规则。
你在本地终端直接敲命令时,终端shell会自动识别引号包裹的内容,把引号内带空格的内容识别为单个参数。但split(" ")只会机械按空格位置切割字符串,完全不识别引号的语义,原本应该作为整体传给adb的长命令,被切割成了零散的碎段,甚至把配对的引号拆成了孤立的半截字符,最终传到设备侧的shell解析时找不到闭合引号,直接抛出/system/bin/sh: no closing quote错误。

修复方法

不要用split切割复杂命令,严格按照参数边界构造字符串数组传给ProcessBuilder或者Runtime.exec,每个独立参数单独作为数组的一个元素,不需要额外保留本地终端用的外层包裹引号:

// 按参数边界构造数组,每个独立元素对应一个命令参数
String[] command = new String[]{
    "adb",
    "exec-out",
    "run-as com.example sh -c 'cd /data/data/com.example/files && tar cf - allure-results' | tar xvf - -C /sdcard/"
};
Process process = Runtime.getRuntime().exec(command);
// 后续正常处理进程的输出流、错误流,等待进程执行完成即可

注意事项

  • 数组里第三个元素是要传给adb exec-out在设备端执行的完整命令串,本身是单个参数,不需要额外套外层双引号——这层双引号是给本地PC终端shell识别参数边界用的,Java直接调用进程时不需要这层给shell看的语法标记。
  • 只要命令参数里包含空格、引号这类特殊字符,就不要用split按空格切割命令,这种写法必然会出现参数拆分错误。
  • 执行命令时要单独启动线程消费进程的标准输出流和错误输出流,避免流缓冲区占满导致进程阻塞卡死。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:42:19