将文件写入/ system

时间:2012-06-29 20:44:13

标签: android io root

我知道这已被问了很多但从未回答过。我绝对需要将文件写入root,没有其​​他解决方案。我目前使用此代码,但它没有在/ system /中显示任何新内容。我想将文件从我的资产复制到/ system文件夹(使用它的子目录)

public void installFiles(View v) {
            try {
        Runtime.getRuntime().exec("su");
    } catch (IOException e) {
        mDebugView.append(e.toString());
    }
    copyPath("system/bin", "/system/bin/");
    copyPath("system/lib", "/system/lib/");
    copyPath("system/etc", "/system/etc/");
    copyPath("system/etc/audio", "/system/etc/audio/");
    copyPath("system/etc/soundimage", "/system/etc/soundimage/");
    copyPath("system/lib/soundfx", "/system/bin/soundfx/");
}

public void copyPath(String from, String to) {
    mDebugView.append("Copying path assets/" + from + " to " + to + "\n");
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list(from);
        for (String filename : files) {
            mDebugView.append(filename + "... \n");
            if (new File(filename).isFile()) {
                mDebugView.append("Copying " + filename + "\n");
                InputStream in = null;
                OutputStream out = null;
                in = assetManager.open(filename);
                out = new FileOutputStream(to);
                copyFile(in, out);
                in.close();
                in = null;
                out.flush();
                out.close();
                out = null;
            }
        }
    } catch (IOException e) {
        Log.e(this.getClass().toString(), e.toString());
        mDebugView.append(e.toString() + "\n");
    }
}

private void copyFile(InputStream in, OutputStream out) throws IOException {
    mDebugView.append("..");
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

4 个答案:

答案 0 :(得分:3)

你的

Runtime.getRuntime().exec("su");

什么都不做。随着流程的创建然后发布。要移动文件,您需要使用带有su的cat二进制文件。 IE

Runtime.getRuntime().exec("su cat filepath1 > filepath2");

对于你想要的任意数量的命令,最好是获取su的流程实例,然后立即执行所有的移动命令。

另请注意,您可能必须将系统分区挂载为rw,因为默认情况下它可能不是r / W.

答案 1 :(得分:2)

您在/system上看不到任何更改,因为默认情况下它是以只读方式挂载的。请确保在写入文件之前重新安装它。虽然其他人提到su应与命令一起使用。

答案 2 :(得分:2)

我一直在挖掘,我找到了办法。

  1. 经过一些尝试后,我的ROM(更确切地说是/ system文件夹)被严重损坏,我总是看到错误输入:“没有许可” - >用湿巾重新安装ROM

  2. 我将文件复制到外部存储(在本例中为/ sdcard,但要注意它可能是另一条路径 - 使用Environment Object来获取路径)。我将所有子文件夹解压缩到主文件夹。

  3. 以前的新代码打开了SU会话并再次关闭。

    Process proc = runtime.exec("su");
                new ProcessReader(proc).start();
                new ErrorReader(proc).start();
                DataOutputStream os = new DataOutputStream(
                        proc.getOutputStream());
                os.writeBytes("chmod 755 /system/" + "\n");
                os.writeBytes("find /sdcard/.beats_cache/systembin -exec mv '{}' /system/bin +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemlib -exec mv '{}' /system/lib +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemetc -exec mv '{}' /system/etc +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemetcaudio -exec mv '{}' /system/etc/audio +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemetcsoundimage -exec mv '{}' /system/etc/soundimage +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemlibsoundfx -exec mv '{}' /system/lib/soundfx +\n");
                os.writeBytes("exit\n");
                os.flush();
    

答案 3 :(得分:1)

在开头运行'su'可能不足以对/ system文件夹具有写权限。 Root Explorer和其他文件管理应用程序都必须重新安装/系统作为r / w并以只读方式重新安装。 this question的答案显示了重新安装/ system路径的命令。答案是使用adb,但在设备上运行它应该可以正常工作。

另一方面,执行系统命令移动文件可能更容易,而不是自己移动文件。在运行Cyanogenmod 7.x的LG Optimus T上,/ system / xbin中有cpmv可以复制/移动文件而无需重新安装/系统(如果是这样,可能只通过{{ 1}}或su mv)。我不太了解android的这一部分,以确定你是否(或安装你的应用程序的人)也会有这些文件,但值得研究。他们可能需要busybox,我没有调查过。