2012年7月16日 星期一

Android 程式以 root 身分執行

相信不少寫 Android App 的開發者一旦有機會,應該都會做 root
這個動作,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


沒有留言:

張貼留言