在 Java 代碼中直接呼叫 Runtime.getRuntime().exec("chmod 777 /data/misc/123.sh") 卻無效,但寫入腳本再用 su -c 執行卻成功。核心差異在於 Shell 環境與權限上下文。
Runtime.exec() 預設不啟動 Shell,無法解析管道、重導向、環境變數。noexec,直接執行二進制可能被阻擋。su 並在 Shell 中執行。String[] command = new String[] {"/bin/sh", "-c", "chmod 777 /data/misc/123.sh"};
Runtime.getRuntime().exec(command);
關鍵點:
/bin/sh -c 啟動 Shell 解析完整命令字串。su -c "chmod 777 /data/misc/123.sh"。Process 的輸入/輸出/錯誤流,避免阻塞。使用 ProcessBuilder 替代 Runtime.exec(),支援目錄設定、環境變數注入、流合併等,更穩健:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "chmod 777 /data/misc/123.sh");
pb.redirectErrorStream(true);
Process process = pb.start();
// 讀取輸出...