从应用程序重新安装/系统

时间:2013-07-16 19:16:56

标签: java android mount

我正在尝试创建一个小型应用程序,它需要对/ system文件夹进行读/写访问(它试图删除一个文件,并创建一个新文件而不是它)。 我可以在没有adb问题的情况下重新安装文件夹,如果我这样做,我的应用程序肯定可以正常工作,直到重新启动。

我的设备已植根(sgs3,库存4.1.2)。我可以毫无问题地获得root访问权限 - 我得到弹出消息,我可以启用它。但之后它并没有真正回应命令。

我有这样的事情:

//at this point I get the popup to grant root access
Runtime.getRuntime().exec("su");

//no error messages - not on console, not in logcat
Runtime.getRuntime().exec("mount -w -o remount -t ext4 /dev/block/mmcblk0p9 /system");

//trying to do things in the system folder...
FileWriter fw=new FileWriter(file);
fw.write("a");
fw.close();

//trying to remount the folder as read only only once everything is done
Runtime.getRuntime().exec("mount -r -o remount -t ext4 /dev/block/mmcblk0p9 /system");

如果我从adb shell运行相同的重新安装命令,一切都很完美。如果我不运行它,但尝试依赖应用程序,当我尝试从文件系统中写入/删除时,会收到以下错误消息(抛出IOException):

open failed: EROFS (read-only file system)

一些额外的信息:我使用2.2 SDK,在我的清单文件中有WRITE_EXTERNAL_STORAGE权限(虽然我不确定是否需要它,因为我正在尝试使用内部存储)。

欢迎所有想法。

1 个答案:

答案 0 :(得分:4)

你的问题是你的进程与你的root进程不同,尝试这样的事情:

Process suProcess;
DataOutputStream os;


try{
        //Get Root
        suProcess = Runtime.getRuntime().exec("su");
        os= new DataOutputStream(suProcess.getOutputStream());

        //Remount writable FS within the root process
        os.writeBytes("mount -w -o remount -t ext4 /dev/block/mmcblk0p9 /system\n");
        os.flush();

        //Do something here
        os.writeBytes("rm /system/somefile\n");
        os.flush();

        //Do something there
        os.writeBytes("touch /system/somefile\n");
        os.flush();

        //Remount Read-Only
        os.writeBytes("mount -r -o remount -t ext4 /dev/block/mmcblk0p9 /system\n");
        os.flush();

        //End process
        os.writeBytes("exit\n");
        os.flush();

   }
catch (IOException e) {
        throw new RuntimeException(e);
    }