注意:这个问题不是只有 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”命令运行多个根操作,但没有像我使用的那样的任何类型的分隔符(这样我就可以区分新命令输出何时开始和上一个结束)。
最佳答案
关于java - 如何连续进行多次根操作(批量根操作)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24313752/