轉:http://blog.csdn.net/alexander_xfl/article/details/9150971
RunTime.exec()這個接口可以說是給我們開發者提供了一個很好的直觀操作底層操作系統的機會,但是這個接口的使用還有很多需要注意的問題。由於要完整的介紹這個接口需要較大的篇幅,我在這里只針對一點進行介紹“如何以root權限執行多條指令”
1.這里首先面對的是root權限,這個需要將手機進行root,具體方法可以通過360一鍵root來搞定。
2.先來看一下這段代碼
Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec("su"); runtime.exec("cmd1"); runtime.exec("cmd2");
這里,執行su是向系統請求root權限,proc是返回執行su的這個獨立進程。
下面來看一下cmd1和cmd2,我們假設這兩個命令都需要root權限,那么按照上述方法寫的話會發現cmd1和cmd2都會出現permission denied。
這是為什么呢?
因為su命令只會使得當前的進程獲得root權限,也就是使得proc獲得root權限,而不是讓整個應用都具有root權限,又由於后面cmd1和cmd2進行runtime.exec的時候又各自存在於一個獨立的進程中,所以不具備root權限。
那么應該怎么來解決呢?往下看
3.讓所有指令處在一個進程中
我滿懷歡喜地執行上述代碼,首先我是知道“cmd_a;cmd_b;cmd_c”這樣的寫法是正確的,而且經過諸如runtime("cd /mnt;ls -l") 這樣的測試證明是可以執行的。
但是上述代碼執行后就卡住了,貌似是進程掛起了,個人覺得是su指令的問題,但是確切原因還不清楚,在這里希望哪位大牛知道原因可以告知一下~先謝過!
4.繼續探尋
既然proc這個進程已經具有了root權限,那么我們就要想辦法怎么在這個線程的前提下進行一些操作,經過查詢,終於求的真經,如下:
Process proc = runtime.exec("su"); DataOutputStream os = new DataOutputStream(proc.getOutputStream()); os.writeBytes("cmd1\n"); os.writeBytes("cmd2\n"); os.writeBytes("exit\n"); os.flush();
這里一定要注意cmd1和cmd2后面的“\n”是不可缺少的,由於DataOutputStream這個接口並不能直接操作底層shell,所以需要"\n"來標志一條命令的結束。
ok,搞定。