在 android 应用程序中挂载 R/W 系统以编辑只读文件

Posted

技术标签:

【中文标题】在 android 应用程序中挂载 R/W 系统以编辑只读文件【英文标题】:Mount R/W system in android application to edit Read Only files 【发布时间】:2011-10-31 01:04:02 【问题描述】:

如何在我的应用程序中编辑/system/ 目录中的文件?

我必须让系统 R/W 可访问吗?

我试过了:

process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes("mount -o remount,rw /system\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();

还有很多其他方法,都没有成功。

如果有人可以帮助我,我将不胜感激! :)

另外,如果我最终成功了,它是否适用于所有有根手机?还是有些手机不一样?

【问题讨论】:

这通常不是一个人应该尝试从安卓应用程序中做的事情。但要做到这一点,文件系统必须重新挂载可写,然后要么必须从根进程修改文件(android 应用程序不是这样,尽管它可能能够以 root 身份启动从属进程),或者让它权限被根进程更改为随后可由非根进程(例如 android 应用程序)写入。 【参考方案1】:

我用:

    os.writeBytes("mount -o remount rw /system/\n"); 
    //instead of a comma, I have a space. 
    //When I tried it with a comma, mine didn't work either.

这让我可以成功挂载。

如果你在那之后立即退出,当然它不会起作用。您必须保持在同一个进程中并使用 linux 命令来编辑文件。

我不知道如何编辑文件,但我建议在 linux 终端中搜索如何执行操作,然后将正确的代码放入 os.writeBytes("CODE_HERE");

不过,就安装过程而言,我不知道该命令是否可以通用。幸运的是,它可以在我的设备上运行。

编辑: 我现在使用 RootTools:http://code.google.com/p/roottools/downloads/list 这是 Wiki 页面:http://code.google.com/p/roottools/w/list

但我现在正在使用:

RootTools.remount(file, mountType);
//For example:
RootTools.remount("/system/", "rw");

我相信这是普遍的

【讨论】:

我实现了这个。实际上它的代码要大得多。为了使其通用,您可以找到每个设备特定的挂载命令的运行时,因为它取决于 /system 的位置。并使其不依赖于busybox,因为也许有人在旧版本等上有他的busybox。感谢您的回复。 你是对的。我认为它不是通用的。我更新了我的答案,我相信 RootTools 会处理整个过程。即使没有,你也有RootTools.getMounts()。不过,RootTools 很棒。我在 XDA 上发现了它们。【参考方案2】:

编辑:以下所有版本的代码都不会将系统安装为 RW。 *阅读下面的 cmets 以了解原因。 解决这个问题不是一个简单的命令。

Edit1:我打开超级用户 apk,设置选项卡,并在最后一项“点击”,以更新 su 二进制文件。有了这个更新,下面的一切都不起作用了。

Edit2:在这里开始了与我自己的完整对话。当前最新二进制文件的修复位于帖子底部

================================================ ====================================

了解如何做到这一点!第二天的努力,终于找到了!!!!!! 尝试了几件事,答案是简单的更改模式,

我做了什么:

第一个版本代码:(不起作用)

String[] mountRW =  "su", "-c",
"chmod  777 /system/etc/build.prop";

String[] mountRO = "su", "-c",
"chmod  755 /system/etc/build.prop";

//TODO REMOVE testing purposes          
File file2 = new File("/system/build.prop");

//Make file Read-Write
process = Runtime.getRuntime().exec(mountRW);
process.waitFor();

//TODO REMOVE testing purposes
Log.d("MOUNT RW?", "RW WRITABLE? "+ file2.canWrite());

///////////////////////
// process the file
//////////////////////

// After editing finish,
//make Read Only file again
process = Runtime.getRuntime().exec(mountRO);
process.waitFor();

//TODO REMOVE
Log.d("MOUNT RO?", "RO WRITABLE? "+ file2.canWrite());

我没有粘贴一些 try catch 案例。 我还遇到了另一个问题。我在版本 2 中解决了这个问题。小问题是,我要求一个特定的 su 命令,而用户必须接受 RO 的 SU cmd,RW 的 SU cmd。 . 和另一个时间在我的程序中的其他东西。 在第二个版本中,我使用通用的 su 命令,因此用户必须接受一次 SU 权限,并且我使用输出流。

代码版本 2(推荐)(不起作用)

String mountRW = "chmod  777 /system/build.prop";
String mountRO = "chmod  755 /system/build.prop";

//TODO REMOVE
File file2 = new File("/system/build.prop");

//Make file Read-Write
process = Runtime.getRuntime().exec("su"); //Generic SU Command
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(mountRW + " \n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();


//TODO REMOVE
Log.d("MOUNT RW?", " RW WRITABLE? "+ file2.canWrite());

////////////////////////////
/// mod the file
///////////////////////////

// After editing finish, make Read Only file again
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(mountRO + " \n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();

//TODO REMOVE
Log.d("MOUNT RO?", "RO WRITABLE? "+ file2.canWrite());
这两个代码都需要您设备上的 Root。 两个版本均不包含捕获案例。 (Eclpise 会为您找到它们) 检查您的 logcat(adb logcat),看看它确实有效! 使用最新的 su 二进制文件,此代码略有变化。更改模式命令需要 4 位数字。 0777 用于 rw 权限,0755 用于 ro 权限! 此代码本身不会对您的设备造成任何影响。

只有它挂载built.prop RW,然后再挂载回RO。 虽然如果你改变它,你可能会破坏你的设备!保重!

【讨论】:

您没有“安装”任何东西,因此该代码将无法正常工作。通常,您必须重新挂载可写的 /system 分区,这可能是您在之前的尝试中所做的。您错误地称为“mountRW”和“mountRO”的命令字符串不会完成安装,而是更改文件权限,以便运行您的 java 代码的非 root 进程可以更改文件。您应该将它们重命名为“chmodRW”或类似的名称。如果您希望它通常有用(在任何需要 root 的情况下都可以通用),您将需要处理 /system 的重新安装 你好克里斯!感谢您花时间回答。 Ver2 在我设备上的 superuser.apk 上的 su 二进制版本上运行良好。但是我将 su 二进制文件更新到最新版本,但它失败了。现在我又想通了。 chmod cmd 需要 4 位数字才能工作。例如“0777”用于安装。这段代码就像一个原型,我想分享,因为我花了很多时间和精力来弄清楚。这不是我在我的程序中实际做的事情。不是很好吗,我没有安装 RW 整个系统,而是我想要修改的特定文件?然后还给RO权限?我想听听你的意见!:) @Psachialis。你误会了。 “chmod”不会“挂载”任何东西。您的代码解决了一个不同的问题,即让非 root 进程修改已可写文件系统上的受保护文件,并且仅够了,因为您已经在上次重新启动后的某个时间安装了整个 /system 可写文件。重启你的设备你会发现它会失败(除非你有一个非标准和设计不佳的设备,通常有 /system 安装可写) 是的!你是 100% 正确的!这对我有用,每次我用根资源管理器编辑特定文件之后。 chmod 成功了。我重新启动后,它没有工作。你能告诉我如何安装系统吗?编辑文件?如果可能的话,一个通用版本。这将适用于所有有根电话。再次感谢您的帮助和耐心,指出我的错误! 一个通用的解决方案会很棘手***.com/questions/5467881/…

以上是关于在 android 应用程序中挂载 R/W 系统以编辑只读文件的主要内容,如果未能解决你的问题,请参考以下文章

Android - 在代码中挂载 Samba 共享

Android:如何从我的 APK 中将文件系统挂载到 RW 中? (当然是有根的)

Linux基础——文件权限管理&光盘镜像挂载

Android 逆向修改 Android 系统文件 ( 重新挂载文件分区 | 在 /system/lib/ 只读目录下创建文件 | 修改 Android 系统文件的意义 )

Android 逆向修改 Android 系统文件 ( 重新挂载文件分区 | 在 /system/lib/ 只读目录下创建文件 | 修改 Android 系统文件的意义 )

Android 逆向Android 系统文件分析 ( 根目录下的目录和文件 | /data/ 应用和用户数据目录 | /mnt/ 挂载其它设备目录 )