【问题标题】:Writing file on system partition在系统分区上写入文件
【发布时间】:2011-12-14 08:40:00
【问题描述】:

我正在尝试将我的应用程序生成的文件写入系统分区。由于我无法在我的应用程序中创建 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" });

【问题讨论】:

    标签: android filesystems root


    【解决方案1】:

    我的猜测是只有第一次调用Runtime.exec()

    r.exec("su");
    

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

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

    【讨论】:

      【解决方案2】:

      好的,我找到了如何使用 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 这样的附加命令就足够了 - 将对其进行测试。

      【讨论】:

      • 请问这个 writeDataToOutputStream(out) 函数是什么?可以发一下吗?
      • 这是我的应用程序将数据写入 myfile.test 的部分。这是特定于应用程序的,因此在这里不感兴趣。
      • 我正在尝试使用您的代码写入 /system/app。我已将我的应用程序安装为系统应用程序(通过手动将其复制到 /system/app )。它具有 sharedUserId=system,并使用平台密钥进行签名。我在第一次调用 writeBytes() 时收到“java.io.IOException: write failed: EPIPE (Broken pipe)”。您能否提供解决此问题的任何线索?我错过了什么?
      • @Chaitanya 你解决了你的问题吗?如果是这样,请解释你是如何解决的。我也面临同样的问题。
      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2015-07-27
      • 2011-04-08
      • 2023-04-09
      • 2020-03-09
      • 1970-01-01
      相关资源
      最近更新 更多