[英]Execute multiple root shell commands in Android
我正在開發一個在不同時間執行多個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();
}
該方法可以正常工作,但是每次我需要調用它時,它總是打開一個新的外殼程序,這樣它就顯示出討厭的吐司“應用程序已被授予root權限”。 我認為這是因為它總是打開和關閉具有SU訪問權限的新外殼。 我的問題是:有什么辦法可以使SU外殼始終保持打開狀態,以便我可以在需要時運行命令而無需接收SU吐司?
因此,這可能有點晚了,但是如果您仍在尋找解決方案:只需聲明
private Process p = Runtime.getRuntime().exec("su");
在您班級的全球范圍內。 這應該適合您的需求。 您實際上可以在onResume()
產生該進程,然后在onPause()
再次destroy()
它。
@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();
}
順便說一句:在上述方法中,我看到了嚴重的內存泄漏:您打開了許多SU進程,但是再也不會destroy()
它們。 取決於您調用此方法的頻率,將有越來越多的SU進程在RAM中徘徊,直到您的應用關閉。
所以
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包圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.