我试图从java中的rooted android设备中的/ data / data文件夹中获取所有文件和文件夹。我有命令在Windows cmd中正常工作:
adb -s <device name> shell su -c ls /data/data/
我尝试在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/
我做错了什么?
答案 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();
}
}