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
相关产品推荐
相关产品推荐

