进程挂起waitFor()方法

时间:2016-02-21 09:27:20

标签: java android process processbuilder

我试图从java中的rooted android设备中的/ data / data文件夹中获取所有文件和文件夹。我有命令在Windows cmd中正常工作:

adb -s <device name> shell su -c ls /data/data/

example

我尝试在java中执行此命令,一切似乎都行,但行

p.waitFor(); 

永远不会回来。

public ArrayList<String> execute(String command) {
    ArrayList<String> line = new ArrayList<String>();
    try {
        ProcessBuilder pb = new ProcessBuilder(adbPath + "adb.exe ", command);
        pb.redirectErrorStream(true);
        Process p = pb.start();
        p.waitFor();
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String tmp;
        while ((tmp = in.readLine()) != null) {
            line.add(tmp);
        }
        line.removeAll(Arrays.asList("", null));
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }
    return line;
}
//adbPath = C:\Users\redra_000\AppData\Local\Android\sdk\platform-tools\
//command = -s E7AZCY935671 shell su -c ls /data/data/

我做错了什么?

2 个答案:

答案 0 :(得分:2)

javadoc表示ProcessBuilder构造函数的参数是:

  

&#34; ...包含程序及其参数的字符串数组&#34;。

并且example清楚地表明它意味着每个参数的单独字符串。您已将所有参数作为一个String传递。此外,您在命令路径名的末尾添加了一个虚假空间。

我建议您查看the example in the javadoc以了解如何实例化ProcessBuilder对象。

另一个问题是,在您阅读waitFor()的输出之前,您似乎正在调用adb。如果你这样做并且adb产生的输出多于管道中可以缓冲的输出,那么你将遇到死锁。在之后调用waitFor() ,你已经阅读了所有的输出。

答案 1 :(得分:0)

试试这个方法.. 必须消耗命令执行期间的任何错误才能退出Process.Waitfor()方法

public void executeScript(String command) {

    try {

        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec(command);

        InputStream stdin = proc.getInputStream();
        InputStreamReader isr = new InputStreamReader(stdin);
        BufferedReader br = new BufferedReader(isr);

        String line = null;

        while ((line = br.readLine()) != null)
            System.out.println(line);

        proc.waitFor();

    } catch (Exception e) {

        e.printStackTrace();
    }

}