gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:39 24 4
gpt4 key购买 nike

注意:这个问题不是只有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com