ProcessBuilder工具类及执行多条命令

该代码示例展示了如何在Java中使用ProcessBuilder类来执行Linux命令,包括处理命令输出和等待命令执行完成。通过将命令列表转换为数组,可以执行多条命令,如压缩、文件编码转换等。

Java代码调用Linux命令执行。

public class ProcessUtil {

    private static final Logger logger = LoggerFactory.getLogger(ProcessUtil.class);

    private static final Integer WAIT_TIME = 20;

    /**
     * 执行脚本命令
     * @param commands
     * @throws
     */
    public static Integer exec(List<String> commands, StringBuffer outPutResult) throws Exception{

        String[] arrCommands = list2Array(commands);
        ProcessBuilder processBuilder =  new ProcessBuilder(arrCommands);
        processBuilder.redirectErrorStream(true);
        Process process = null;
        try {
            process = processBuilder.start();
            final BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8));

            new Thread(() -> {
                try {
                    String str;
                    while ((str = br.readLine()) != null) {
                        if(outPutResult != null){
                            outPutResult.append(str);
                        }else{
                            logger.info(str);
                        }
                    }
                }catch (Exception e) {
                    logger.error("获取子进程输出错误:", e);
                }
            });

            process.waitFor(WAIT_TIME, TimeUnit.SECONDS);
            return process.exitValue();
        } finally {
            if(process != null){
                process.destroy();
            }
        }
    }

    /**
     * List转String
     * @param commands
     * @return
     */
    private static String[] list2Array(List<String> commands){
        String[] commends = new String[commands.size()];
        commands.toArray(commends);
        return commends;
    }
}

执行多条命令:

 * List<String> commend = new ArrayList<>();
 * commend.add("/bin/sh");
 * commend.add("-c");
 * //   /bin/bash -c '7zzs x /usr/data/tmp/测试.zip -o/usr/data/tmp/one/ && convmv -f GBK -t utf8 --notest -r /usr/data/tmp/one/'
 * commend.add("第1条命令 && 第2条命令 && 第3条命令 ..."); //这里可以实现执行多条linux命令
 * Process process = ProcessBuilder.exec(commend);
 * String message = ProcessBuilder.getOutput(process);
 * String error = ProcessBuilder.getError(process);
 * ProcessBuilder.destroy(process);
<think> 首先,用户在询问:"我想查找在Android开发中使用Java执行adb命令的方法"。这意味着他们想知道如何在Android应用中使用Java代码来运行ADB命令。 从系统级指令中,我需要: - 所有行内数学表达式用$...$格式(但这里可能不涉及数学表达式)。 - 独立公式用$$...$$单独成段(同样,可能不适用)。 - LaTeX语法正确(确保任何技术细节准确)。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 用户提供了两个引用: - 引用[1]:描述在JAVA中使用adb命令操作安卓手机,包括创建String数组保存命令,启动Process类,使用ProcessBuilder,启动和销毁process。 - 引用[2]:列出了Android ADB常用命令,如cat、cd等。 用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。" 但在这个对话中,这是第一条消息,所以没有"上一次的问题"。因此,我应该专注于当前查询。 我的回答结构应该清晰,帮助用户逐步解决问题。确保真实可靠的知识。 关键点:用户在Android开发中使用Java执行ADB命令。ADB(Android Debug Bridge)通常是从命令行运行的,但在Android应用中,应用运行在设备上,直接执行ADB命令可能不直接,因为ADB需要连接到设备或模拟器。实际上,在安卓应用中执行ADB命令通常是受限的,因为标准应用没有权限运行shell命令,除非设备已root或有特殊权限。 在Android开发中,常见的做法是: - 使用Runtime.getRuntime().exec() 或 ProcessBuilder执行shell命令。 - 但ADB命令通常需要连接到主机上的adb服务器,所以从设备本身运行adb命令可能不直接可行;可能需要间接方式。 根据引用[1],它描述了在Java(可能是桌面Java)中使用ProcessBuilder启动adb.exe。但在Android应用中,adb不是内置的;adb是一个主机工具。 用户指定了"Android开发",这意味着在安卓应用中运行代码。 真实方法: - 在Android应用中,你可以使用Java代码执行shell命令,包括一些类似ADB的命令,但标准ADB命令如"adb devices"需要adb二进制文件,这在设备上通常不可用。 - 相反,可以使用adb shell命令的子集,通过Runtime.exec()或ProcessBuilder运行shell命令。 - 例如,执行"pm list packages"或"input keyevent"等命令,这些是adb shell命令的一部分。 - 设备需要有root权限才能运行某些命令。 从引用[1],它提到了使用ProcessBuilder启动adb.exe,但那适用于主机端Java程序,而不是Android应用。 在Android开发中: - 要执行shell命令,使用Java的Runtime类或ProcessBuilder。 - 示例代码:Runtime.getRuntime().exec(command); - 但需要注意权限;应用需要shell权限或root。 用户的需求:"在Android开发中使用Java执行adb命令的方法"。我应该澄清: - ADB命令通常运行在主机上。 - 在安卓设备上,使用Runtime.exec运行shell命令。 生成相关问题:按照指令,在结束时生成相关问题。 回答结构: 1. **清晰介绍**:解释在Android应用中使用Java执行命令的一般方法。 2. **具体步骤**:基于引用[1],提供代码示例。 3. **警告和限制**:提到权限问题和设备root状态。 4. **示例代码**:使用Java代码展示。 5. **相关问题**:结束时生成几个相关问题。 使用中文回答。 添加引用标识:引用提供的引用[1]和[2],在相关段落末尾添加[^1]和[^2]。 组织回答: - 开头:简要介绍。 - 主体:详细步骤。 - 结尾:相关问题。 代码示例:类似于引用[1]的描述。 </think> ### Android开发中使用Java执行ADB命令的方法 在Android开发中,使用Java执行ADB命令是一种常见需求,主要用于调试、自动化测试或设备管理。需要注意的是,ADB命令通常运行在主机(如PC端)上,但如果您希望在Android应用内部执行类似ADB的命令(例如Shell命令或ADB Shell子集),这可以通过Java的Runtime类或ProcessBuilder实现。然而,实际执行取决于设备权限:标准应用只能运行有限命令(如列出包名),而高级命令(如安装APK或修改系统设置)通常需要设备已root或应用拥有SYSTEM权限[^1]。以下是逐步实现方法: #### 步骤1: 准备命令和参数 ADB命令本质上是shell命令。在Java中,您需要构建一个包含命令的字符串数组。参考引用[1],命令格式应包括adb路径(在设备上通常为`/system/bin/sh`或直接使用shell命令)、设备ID(多设备时)以及具体的ADB操作。 - 例如,执行`adb shell pm list packages`命令在应用中转化为`pm list packages`(省略adb前缀)。 - 创建字符串数组保存命令: ```java String[] command = {"sh", "-c", "pm list packages"}; // 示例:列出所有安装的包 ``` 这里: - `sh` 指定使用shell解释器。 - `-c` 表示执行后续命令字符串。 - 您可以根据需要替换命令,如`input keyevent KEYCODE_HOME`模拟Home键[^2]。 #### 步骤2: 启动和执行命令 使用Java的`ProcessBuilder`或`Runtime.getRuntime().exec()`启动进程。推荐`ProcessBuilder`因为它更灵活且易于处理输入/输出流。 - 示例代码: ```java try { // 创建ProcessBuilder实例 ProcessBuilder pb = new ProcessBuilder(command); pb.redirectErrorStream(true); // 合并错误流和输出流,便于读取 // 启动进程 Process process = pb.start(); // 读取命令输出 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; StringBuilder output = new StringBuilder(); while ((line = reader.readLine()) != null) { output.append(line).append("\n"); } // 等待命令执行完成 int exitCode = process.waitFor(); Log.d("ADB_COMMAND", "Exit Code: " + exitCode + ", Output: " + output.toString()); // 关闭资源 reader.close(); process.destroy(); } catch (IOException | InterruptedException e) { e.printStackTrace(); Log.e("ADB_COMMAND", "执行失败: " + e.getMessage()); } ``` **关键点:** - `pb.start()` 启动进程,执行命令。 - 使用`waitFor()`确保命令完成后再处理结果。 - 记得调用`process.destroy()`释放资源[^1]。 #### 步骤3: 处理常见场景和限制 - **权限要求**:Android应用默认运行在沙箱中。普通命令(如`pm list packages`)无需特殊权限,但涉及系统操作(如`adb install`或`chmod`)需要: - 在AndroidManifest.xml添加`<uses-permission android:name="android.permission.INTERNET" />`(如果涉及网络)。 - 对于敏感命令(如重启设备),设备必须root,并在代码中申请`su`权限(例如:`String[] command = {"su", "-c", "reboot"}`)。 - **命令列表参考**:常用ADB Shell命令包括: - `cat /proc/cpuinfo`(查看设备信息) - `input keyevent KEYCODE_BACK`(模拟后退键) - `pm install /sdcard/app.apk`(安装APK,需root) - 更多命令详见引用[2]中的列表,如`ls`、`grep`等[^2]。 - **错误处理**:捕获`IOException`和`InterruptedException`,确保应用不会崩溃。输出流处理避免阻塞UI线程(建议使用AsyncTask或后台线程)。 #### 注意事项 - **设备兼容性**:在模拟器或真实设备上测试。非root设备可能返回权限错误。 - **替代方案**:如果需要在主机端执行ADB(如从PC控制设备),建议使用Android Studio的ADB工具或编写独立Java程序(非Android应用),如引用[1]所述[^1]。 - **安全风险**:执行shell命令可能引入安全漏洞,确保命令来源可信。 通过以上方法,您可以在Android应用中实现基本ADB命令执行。但请根据实际需求调整命令和权限设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值