【发布时间】:2014-08-10 09:55:43
【问题描述】:
注意:这个问题不仅仅适用于 Android 开发者。对于在 Linux 上执行 root 操作的 Java 开发人员来说应该也是如此。
背景
My app 允许用户执行各种root 操作(只能在root 设备上执行的操作)。
到目前为止,每次应用希望执行 root 操作时,我都会使用 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;
上面的代码(应该)确保我有 root 并且我可以继续处理 "_out" 和 "inputStreamReader" 。对“echo”的调用有两个目的:进行一些假操作,也成为命令之间的起点和分隔符。
这里的第二个目的是假的,但是对于我进一步进行的每个操作,这就是我想到的处理各种根操作分离的方式。
现在,如果我想进行另一个根操作(假设上述操作正常),这是我希望执行的操作示例:
_out.write(("find "+someFolderPath+"/* -type f\n").getBytes());
_out.flush();
final String line=_inputStreamReader.readLine();
问题是,它卡在“readLine”部分,即使它应该返回指定路径中所有文件/文件夹的列表。
该命令使用我之前执行 root 操作的方式完美运行,它也应该在这里运行。
在这些行之前使用“echo”,然后使用“readLine()”表明它仍然可用,因为我仍然会得到结果行。但是,尝试再次调用“readLine()”(在上述命令之后)仍然会卡住。
我也尝试在“find”命令之前添加“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 android linux root batch-processing