這個動作,root 後可以做很多很有趣的事情(無誤)
不過要怎麼樣撰寫一個需要 root 權限的程式可能就是比較少接觸
的部分了。
首先,通常會需要 root 權限的程式幾乎都是利用 shell 來執行一些
命令,所以基本上大多是會碰到 linux shell 的東西。
<<不想看廢話可以跳到最下面>>
例如:
RootExplorer - 利用 ls -l 取出資料分析再套上 UI
AdFree - 修改 hosts 檔案
所以說其實最基本的 root 程式就是以 root 身分執行 shell command
既然 Android 本身是以 linux 為核心,那麼用 java.lang.Runtime
的 exec 指令去執行命令就是執行 linux 指令了,也就是說透過
Runtime 的 exec 來執行 shell command。
(有寫過 php 的人應該對這個 exec 不陌生吧)
先來看一下 java 要怎麼執行一個 command:
Runtime runtime = Runtime.getRuntime(); Process proc=runtime.exec("ifconfig");
這樣就可以執行 ifconfig 這個指令了
可以參考一下 Java API , Process 有提供
getInputStream 和 getOutputStream 這兩個方法
大概可以猜到 InputStream 可以把這個 process 傳回的資料拿回
來用。而 OutputStream 就是萬一還需要輸入什麼東西的話,可以
透過 OutputStream做輸入。
所以要以 root 身分執行某 shell , 只需要這樣做:
Process proc=runtime.exec("su"); DataOutputStream opt = new DataOutputStream(proc.getOutputStream()); opt.writeBytes("ifdown eth0\n"); opt.writeBytes("exit\n"); opt.flush()
首先執行 su , 也就是切換到 root 身分,接著下指令 「ifdown eth0\n」
\n 是換行,就想像我們在 console 要按下 enter 才會執行命令。
如此一來就可以關閉 eth0 這個網卡。
接著在執行 「exit\n」離開 su。
PS:到 flush 之前,命令是不會執行的。
要取得傳回的資料也就只要 getInputStream 抓進來就好了。
不過要注意,Process 如果沒有結束,那麼 inputStream 是不會
到底的( End of Stream),所以最後面都要加上 exit\n 這個指令,
代表離開 su ,這樣 process 才會終止。
底下提供一個我寫的簡單 UtilClass 有興趣可以參考看看:
http://pastie.org/4261494
沒有留言:
張貼留言