在系统分区上写文件

时间:2011-10-24 18:13:43

标签: android filesystems root

我正在尝试将我的应用生成的文件写入系统分区。因为我无法在我的应用程序中创建FileOutputStream,所以我在我的应用程序的数据目录中创建了该文件,更正了权限,然后将其移动到系统分区。

目前,下面的代码错过了/ system的可写重新安装 - 出于测试目的,我已经通过adb remount成功执行了此步骤 - 因此这不应该是问题。

该应用也获得了成功的root权限。

但是下面的代码不起作用。它只创建文件,但不会将其移动到系统分区。我的错是什么?

FileOutputStream out = openFileOutput("myfile.test", MODE_WORLD_READABLE);
File f = getFileStreamPath("myfile.test");
writeDataToOutputStream(out);
out.close();
String filename = f.getAbsolutePath();
Runtime r = Runtime.getRuntime();
r.exec("su");
// Waiting here some seconds does not make any difference
r.exec(new String[] { "chown", "root.root", filename });
r.exec(new String[] { "chmod", "644", filename });
r.exec(new String[] { "mv", filename, "/system/myfile.test" });

2 个答案:

答案 0 :(得分:3)

我的猜测是只有第一次拨打Runtime.exec()

r.exec("su");

创根。 Runtime.exec()的文档说每个调用都作为一个单独的进程运行。因此,execchownchmod的所有后续调用都会以当前应用进程的权限运行 - 因此会失败。

您可以编写一个小的shell脚本,然后将shell脚本作为参数传递给mv。然后所有命令都将以root权限运行。

答案 1 :(得分:1)

好的,我找到了如何使用root权限执行多个命令。诀窍是将所有命令发送到一个su进程:

FileOutputStream out = openFileOutput("myfile.test", MODE_WORLD_READABLE);
File f = getFileStreamPath("myfile.test");
writeDataToOutputStream(out);
out.close();
String filename = f.getAbsolutePath();
Runtime r = Runtime.getRuntime();
Process suProcess = r.exec("su");
DataOutputStream dos = new DataOutputStream(suProcess.getOutputStream());
dos.writeBytes("chown 0.0 " + filename + "\n");
dos.flush();
dos.writeBytes("chmod 644 " + filename + "\n");
dos.flush();
dos.writeBytes("mv " + filename + " /system/myfile.test\n");
dos.flush();

唯一剩下的东西(不包括上面的代码)是使/system可写。 可能是一个额外的命令,如mount -o rw,remount /system就足够了 - 将测试它。