我正在开发一个在不同时间执行多个shell命令的应用程序。 我正在使用以下方法:
public void RunAsRoot(String[] cmds){
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String tmpCmd : cmds) {
os.writeBytes(tmpCmd+"\n");
}
os.writeBytes("exit\n");
os.flush();
}
这个方法工作正常,但每次我需要调用它时总会打开一个新shell,这样它就会显示恼人的toast“应用程序已被授予root权限”。 我认为这是因为它始终打开并关闭一个具有SU访问权限的新shell。我的问题是:有没有办法让SU shell始终打开,以便我可以在需要时运行我的命令而不接收SU toast?
答案 0 :(得分:0)
所以这可能有点晚了,但是如果你还在寻找解决方案:只需声明
private Process p = Runtime.getRuntime().exec("su");
全班同学。这应该符合您的需求。
您实际上可以在onResume()
中再次在destroy()
和onPause()
中生成该流程。
@Override
onResume() {
if(//check for root) {
try {
this.p = Runtime.getRuntime().exec("su");
}
catch(IOException e) {
// Exception handling goes here
}
}
//set up everything else
}
@Override
onPause() {
this.p.destroy();
}
BTW:我在上面的方法中看到了严重的内存泄漏:你打开了各种SU进程,但再也没有destroy()
。根据您调用此方法的频率,在您的应用关闭之前,RAM中会有越来越多的SU进程。
所以
public void runAsRoot(String[] cmds){
try {
Process p = Runtime.getRuntime().exec("su");
}
catch(IOException e) {
// Exception handling goes here
}
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String tmpCmd : cmds) {
os.writeBytes(tmpCmd+"\n");
}
os.writeBytes("exit\n");
os.flush();
p.destroy();
}
在这里会很好。我也问自己是否可以编译你的方法。通常Runtime.getRuntime().exec();
必须被try / catch包围。