java - 如何连续进行多次根操作(批量根操作)?

标签 java android linux root batch-processing

注意:这个问题不是只有 Android 开发者才有必要回答的。在Linux上进行root操作的Java开发者应该也是一样的。

背景

My app允许用户执行各种根操作(只能在根设备上执行的操作)。

到目前为止,每次应用程序希望执行根操作时,我都会使用 Runtime.getRuntime().exec("su") 命令打开一个新进程。

我希望通过仅调用此命令一次,然后写入 outputStream 并同时从 inputStream 读取来改进应用程序的工作方式。

执行此操作的类似应用是“Terminal emulator”。一旦您在那里输入“su”(并授予它 root 权限),它将允许您执行任何 root 操作并读取设备的任何路径。

问题

似乎只有“echo”命令有效,但任何其他命令都无效。此外,我想不出一种区分根操作输出的好方法。

我尝试过的

首先,为了初始化根批处理操作,我这样做了:

  process=Runtime.getRuntime().exec("su");
  _inputStreamReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
  _out=process.getOutputStream();
  final String testLine=Long.toString(System.currentTimeMillis());
  _out.write(("echo "+testLine+"\n").getBytes());
  _out.flush();
  final String resultLine=_inputStreamReader.readLine();
  if(resultLine==null)
    {
    _out.write("exit \n".getBytes());
    _out.flush();
    _out.close();
    _out=null;
    _inputStreamReader.close();
    _inputStreamReader=null;
    process.waitFor();
    return false;
    }
  while(!resultLine.equals(testLine))
    resultLine=_inputStreamReader.readLine();
  return true;

上面的代码(应该)确保我有根并且我可以继续处理“_out”和“inputStreamReader”。调用“echo”有两个目的:完成一些伪造的操作,并成为命令之间的起点和分隔符。

这里第二个目的是假的,但是对于我进一步做的每一个操作,这是我想到的处理各种根操作分离的方式。

现在,如果我想进行另一个根操作(假设上面的操作正常),这是我希望执行的操作示例:

_out.write(("find "+someFolderPath+"/* -type f\n").getBytes());
_out.flush();
final String line=_inputStreamReader.readLine();

问题是,它卡在“readLine”部分,即使它应该返回指定路径内所有文件/文件夹的列表。

此命令使用我之前执行 root 操作的方式完美运行,在这里也应该运行。

在这些行之前使用“echo”然后使用“readLine()”表明它仍然可用,因为我仍然会得到结果行。但是,尝试再次调用“readLine()”(在上述命令之后)仍然会卡住。

我也试过在“查找”命令之前添加“su”(或“su -”或“su -c”),但没有帮助。

这是旧代码,可以正常工作:

  final Process p=Runtime.getRuntime().exec("su");
  final InputStream inputStream=p.getInputStream();
  final DataOutputStream os=new DataOutputStream(p.getOutputStream());
  os.writeBytes("find "+someFolderPath+"/* -type f\n");
  os.writeBytes("exit\n");
  os.flush();
  //read from the inputstream (using BufferedReader) as much as I wish, till it ends.

问题

我应该如何避免为根操作重新创建新进程?这是一个好方法吗?

如何修复上面的代码?有什么问题吗?

此外,有没有一种好方法可以使用单个“su”命令运行多个根操作,但没有像我使用的那样的任何类型的分隔符(这样我就可以区分新命令输出何时开始和上一个结束)。

最佳答案

我敢肯定,您的查找命令太慢了。您应该在不同的进程中运行它。 There是很棒的图书馆来做到这一点。还有一个manual .

关于java - 如何连续进行多次根操作(批量根操作)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24313752/

相关文章:

linux - 使用 bool 查询在术语过滤器中搜索大量关键字会使终端崩溃

java - 根据 jcombobox 中的值加载不同的 JPanel

java - 从Activity传递参数到doInBackground方法,异步任务

java - Fragment 和 ListFragment 不兼容

android - 我可以在解析时将一个人与 Twitter 和 Facebook 联系起来吗?

java - 设置多节点集群来运行mapreduce程序

linux - 仅在 shell 脚本中将文件复制到我的 usb

java - java中日期时区格式的转换

java - 如何设置 Java 小程序透明度以显示其背后的内容?

java - XLSX 的 CellStyle 数据格式