2011-10-16 82 views
2

請原諒我,我不是Linux核心程序員。這是我第一次做任何Linux編碼,因此對我一無所知。在Android應用程序中執行shell腳本

因此,我已經閱讀了大量關於這個主題的文章,並且我很難弄清楚我的代碼正在發生什麼。基本上,我試圖創建一個個人檔案應用程序。該設備已生根幷包含BusyBox。我寫了一個linux腳本,根據登錄的用戶交換/ data和/ cache分區。

當我從ADB執行這個腳本時,它完美地工作。我想在應用中實現它會相當容易。

#SP登錄用戶名密碼

Android的重新初始化與新的配置文件和一切都很好。這是我在Android的:

Log.v("Profiles", "sp login " + user + " " + password); 
Process process = Runtime.getRuntime().exec("sp login " + user + " " + password); 

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
int read; 
char[] buffer = new char[4096]; 
StringBuffer output = new StringBuffer(); 
while ((read = reader.read(buffer)) > 0) { 
    output.append(buffer, 0, read); 
} 
reader.close(); 
process.waitFor(); 
Log.v("Profiles", output.toString()); 

唯一的記錄是我的「回聲」在實際的腳本本身。我看不到在該腳本中執行的命令的任何結果。例如,當在ADB中運行時,所有安裝命令和我所做的不同事情都有輸出。這些都不會在輸出字符串中輸出。

有什麼建議嗎?

+0

如果'password'包含shell元字符,如';'或'&'或'*'或'''你執行exec()'調用可能不執行,你?期望。如果Android允許你訪問更像'execve(2)'而不像'system(3)'的東西,那麼使用它會是明智的。 (雖然我不認爲這與你目前的問題有關。) – sarnold

+0

沒有。密碼中沒有特殊字符。只是一個簡單的字符串,雖然這是我需要檢查的東西。而且,儘管我對這方面的知識並不是很瞭解,但Android似乎並不存在。 – normmcgarry

回答

0

您需要爲進程執行「su」,它將執行您的shell腳本。

否則,即使設備已經生根,該過程也沒有root權限。

下面的代碼是一個供您參考的例子。

public void RunAsRoot(String[] cmds){ 
    try{ 
     Process p = Runtime.getRuntime().exec("su"); 
     DataOutputStream os = new DataOutputStream(p.getOutputStream()); 
     for(String tmpCmds : cmds){ 
      os.writeBytes(tmpCmds+"\n"); 
      os.flush(); 
      os.writeBytes("exit\n"); 
      os.flush(); 
     } 
     BufferedReader stdInput = new BufferedReader(new 
      InputStreamReader(p.getInputStream())); 

     // read the output from the command 
     String s = null; 
     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 
    }catch(Exception e){ 
     Log.e(LOG_TAG, "RunAsRoot exec failed"); 
    } 

}