在Android中执行多个root shell命令

时间:2014-11-09 20:10:14

标签: android root

我正在开发一个在不同时间执行多个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?

1 个答案:

答案 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包围。