我正在开发一个必须读取受保护文件夹内容的小应用程序,所以我得出的结论是我必须将su与ls和输入流结合使用。
但是,当readLine函数到达输出的末尾时,它只会挂起。我猜这是因为最后一行不包括EOL标记......
代码:
p = Runtime.getRuntime().exec("su");
outputS = new DataOutputStream(p.getOutputStream());
inputS = new DataInputStream(p.getInputStream());
errorS = new DataInputStream(p.getErrorStream());
outputS.writeBytes("ls /datadata" + "\n");
outputS.flush();
while((s = inputS.readLine()) != null)
{
Log.i("DS", s);
}
Log.i("DS", "done");
我该如何解决这个问题?我已经尝试过读取字符,然后等待-1,但这不起作用,与上面相同。理想情况下,我会在没有系统调用的情况下执行此操作,但Android遗憾地不允许我列出或复制此文件夹的内容...
感谢您阅读本文, 五重峰
编辑:感谢下面的回答,我解决了我的问题,无论你做什么,只要确保你像使用adb shell时那样结束“su”任务。您可以使用已接受答案中描述的方法,或在您执行任何操作后手动运行“退出”。运行退出确实会在错误流中生成两个空行,原因我不知道。答案 0 :(得分:1)
su
仍在等待执行更多命令
您可以告诉su
只执行一个命令,然后退出。
变化
p = Runtime.getRuntime().exec("su");
到
p = Runtime.getRuntime().exec(new String[]{"su", "-c", "ls /datadata"});
并删除outputS...
行