2013-04-09 105 views
2

我是Android新手。我試圖運行一個shell命令來重命名系統中的文件。我有root權限。如何在Android應用程序中運行重命名shell命令(已過濾)

shell命令:

$ su 
# mount -o remount,rw /system 
# mv system/file.old system/file.new 

我都試過,但不起作用:

public void but1(View view) throws IOException{ 
    Process process = Runtime.getRuntime().exec("su"); 
    process = Runtime.getRuntime().exec("mount -o remount,rw /system"); 
    process = Runtime.getRuntime().exec("mv /system/file.old system/file.new"); 
} 
+1

我確定有錯誤信息或類似的東西......你爲什麼不分享你的問題? – mthmulders 2013-04-09 10:26:18

回答

4

您可以使用相同的過程,通過寫命令運行一個以上的命令進程的OuputStream。這樣,命令將運行在與su命令運行相同的環境中。喜歡的東西:

Process process = Runtime.getRuntime().exec("su"); 
DataOutputStream out = new DataOutputStream(process.getOutputStream()); 
out.writeBytes("mount -o remount,rw /system\n"); 
out.writeBytes("mv /system/file.old system/file.new\n"); 
out.writeBytes("exit\n"); 
out.flush(); 
process.waitFor(); 
+0

@cyanide否,'getOutputStream()'返回連接到子進程正常輸入的輸出流。輸出到流被輸入到由此Process對象表示的流程的標準輸入中。請參閱[javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#getOutputStream()) – dan 2013-04-09 10:45:18

+0

哇這是工作非常感謝 – Mahendra 2013-04-09 10:53:20

+0

@ user2244000不客氣。你可以接受它有幫助的答案:)。 – dan 2013-04-09 12:13:20

0

你需要每個命令要在同一進程中su,因爲切換到root並不適用於您的應用程序,它適用於su,你要mount之前從而完成。

相反,要做兩分Exec的:

...exec("su -c mount -o remount,rw /system"); 
...exec("su -c mv /system/file.old system/file.new"); 

此外,要知道,我已經看到了一些系統,其中mount -o remount,rw /system會失敗然而mount -o remount,rw /dev/<proper path here> /system會成功。這裏的「正確途徑」不同於一個製造商,但可以通過編程收集。

相關問題