歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android開發切換host應用

由於在工作過程中常需要切換手機的host來測試不同服務器上的接口,所以想到需要這麼個軟件。

SwitchHost在PC上是一款很好用的修改Host的軟件,手機上也需要這麼一款App(當然手機需要已經ROOT),於是就嘗試做這麼個手機應用SwitchHost,主要的功能是要能在不同的Host方案之間進行切換。

代碼在git上:https://github.com/jianfengye/Android_Works/tree/master/SwitchHost

裡面的bin文件夾有apk,可以直接安裝。

需求

它的UI設計大概是這樣的(用的都是系統自帶的控件)

分析這個功能:

1 可以增加一個host方案

2 可以修改一個host方案

3 可以設置某個host方案為當前方案

4 可以刪除某個host方案

 

這篇記錄下開發這個的過程中遇到的問題:

1 如何獲取ROOT權限

由於Android的host是在/system/etc/hosts,所以需要使用root來進行文件替換。(當然前提是你的機器是已經可以root了)

獲取ROOT權限使用這麼一個句子:

Process process = Runtime.getRuntime().exec("su");

但是每次調用這個語句的時候都會出現"該應用已經獲取了ROOT權限",所以這個process對象有必要使用單例模式來存儲。

還有一點,調用這個語句之後,其實是啟動了一個process,並不是說當前執行的Activity已經獲取了ROOT權限,所以說後續的root操作就需要使用命令行來執行,而不能使用程序。

比如這裡獲得了root的進程之後,我原本想要使用File類來修改/system/etc/hosts發現還是出現權限錯誤的異常。後來改成了使用/system/xbin/cp命令才能使用。

在Android中,系統的可執行文件不是在/usr/bin下的,而是在/system/xbin/下的,cp的命令和linux是一樣的,加一個-f是強制執行。 

下面是一個完整的獲取root權限,並執行cp -f source desc的例子:


Process process = null;

DataOutputStream os = null;

 

try {

 String hostPath = context.getFilesDir() + "/" + hostName;

    String cmd="/system/xbin/cp -f " + hostPath + " " + "/etc/hosts";

    process = Runtime.getRuntime().exec("su"); //切換到root帳號

    os = new DataOutputStream(process.getOutputStream());

    os.writeBytes(cmd + "\n");

    os.writeBytes("exit\n");

    os.flush();

    process.waitFor();

} catch (Exception e) {

    return false;

} finally {

    try {

        if (os != null) {

            os.close();

        }

        process.destroy();

    } catch (Exception e) {

    }

}

更多詳情見請繼續閱讀下一頁的精彩內容:http://www.linuxidc.com/Linux/2013-09/90126p2.htm

Copyright © Linux教程網 All Rights Reserved