【问题标题】:Reading "ls /datadata" output in loop循环读取“is /data data”输出
【发布时间】:2011-09-05 07:31:00
【问题描述】:

我正在开发一个必须读取受保护文件夹内容的小型应用程序,因此我得出结论,我必须将 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 不会让我列出或复制此文件夹的内容...

感谢您阅读本文, 五重奏

编辑:感谢下面的答案,我解决了我的问题,无论你做什么,只要确保你结束“su”任务,就像你在使用 adb shell 时所做的那样。您可以使用接受的答案中描述的方法,也可以在完成所需的任何操作后手动运行“退出”。由于我不知道的原因,运行 exit 确实会在错误流中生成两个空行。

【问题讨论】:

    标签: java android datainputstream


    【解决方案1】:

    su 仍在等待更多命令执行

    您可以告诉su 只执行一个命令,然后退出。 改变

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

    p = Runtime.getRuntime().exec(new String[]{"su", "-c", "ls /datadata"});
    

    并删除 outputS...

    【讨论】:

    • 啊,对了,所以基本上我每次做某事时都请求 su 而不是一次。同样有效的是添加另一个输出行:“outputS.writeBytes("exit" + "\n");",我认为当您有许多需要 su 的任务时,这会更有效,对吗?所以谢谢你的解释!
    猜你喜欢
    • 2018-05-23
    • 2010-09-29
    • 1970-01-01
    • 2018-03-22
    • 2015-08-07
    • 2016-08-21
    • 1970-01-01
    • 2011-11-19
    • 2019-07-27
    相关资源
    最近更新 更多