有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Java程序执行ADB命令

我正在开发的程序使用ADB(Android Debug Bridge)向我的手机发送文件:

for (String s : files)
    String cmd = "adb -s 0123456789ABCDEF push " + s + " /mnt/sdcard/" + s;
    try {
        InputStream is = Runtime.getRuntime().exec(cmd).getInputStream();
        while (is.read() != -1) {}
    } catch (IOException e) {
        e.printStackTrace();
    }

我希望程序等到ADB完成传输,但ADB作为守护进程运行,因此永远不会完成。但该程序立即继续,不知何故,文件没有发送到我的手机(日志中没有例外)。在没有问题的情况下从控制台运行命令

我做错了什么?如何通过ADB正确发送文件

注意:is.read() == -1将不起作用,因为ADB守护进程将所有输出写入系统标准输出。我试着把它转发到一个文本文件中。它保持为空,输出仍然被写入终端

EDIT:读取ADB进程的错误流会为每个adb push-命令返回ADB帮助。同样地,exact命令(从Eclipse控制台复制)在终端中工作

编辑2:使用ProcessBuilder而不是RUntime.getRuntime.exec()导致以下错误:

java.io.IOException: Cannot run program "adb -s 0123456789ABCDEF push "inputfile "outputfile""": error=2, File or directory not found

在ProcessBuilder的start()-方法中 使用ADB的绝对路径(/usr/bin/adb)时也会发生同样的情况。inputfile和outputfile字符串也是绝对路径,比如/home/sebastian/testfile,并且绝对存在。当从终端运行命令(字符串“cmd”打印、复制和粘贴)时,evreything仍然可以正常工作


共 (2) 个答案

  1. # 1 楼答案

    最好给出ADB执行的完整路径:如下$ANDROID_HOME/platform-tools/adb devices

    以下是您可以使用的完整代码:

    String cmd = "$ANDROID_HOME/platform-tools/adb devices";
    ProcessBuilder processBuilder = new ProcessBuilder();
    if (Config.osName.contains("Windows"))
        processBuilder.command("cmd.exe", "/c", cmd);
    else
        processBuilder.command("bash", "-c", cmd);
    
    Process process = processBuilder.start();
    
  2. # 2 楼答案

     public static void adbpush() {
            System.out.println("adb push....");
            String[] aCommand = new String[] { adbPath, "push", inputFile(String),OutputDirectory };
            try {
                // Process process = new ProcessBuilder(aCommand).start();
                Process process = Runtime.getRuntime().exec(aCommand);
                process.waitFor(3, TimeUnit.SECONDS);
                System.out.println("file pushed");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }