在Android中读取超级用户进程输出

时间:2011-10-15 23:26:15

标签: android

我正在尝试使用超级用户(su)以下列方式定期运行shell命令:

首先我得到了su进程:

Process p = Runtime.getRuntime().exec("su");

然后,定期我跑:

p.getOutputStream().write("some shell command".getBytes());
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = r.readLine()) != null) //Process output line

这个问题是r.readLine()阻塞而且永远不会返回。只有当我创建一个新的su进程并在读取输出之前添加p.getOutputStream()。close()时代码才会成功。

有没有办法使用单个su进程发出shell命令?

2 个答案:

答案 0 :(得分:1)

FWIW,我刚刚遇到同样的问题,似乎我通过检查BufferedReader上的r.ready()来解决它。如果没有更多行要从进程输出中读取,则r.ready()返回false。我不知道在不同版本的操作系统中它有多可靠,但它适用于2.3。

编辑:同样,在开始读取输出之前,请确保稍微休眠一下(例如,200ms),以便命令的所有输出都进入缓冲区。

答案 1 :(得分:0)

您必须使用ProcessBuilder定义流程 尝试:

Process p = new ProcessBuilder()
    .command("su")
    .redirectErrorStream(true)
        .start();
BufferedReader inputReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
while (inputReader.ready() && (line = inputReader.readLine()) != null)
            {
                System.out.println(line);
            }

如果您对区分out和err流不感兴趣,请使用redirectErrorStream(true)合并两个流。这简化了您的阅读代码,并且更容易避免阻止目标进程。 Link