我知道这已被问了很多但从未回答过。我绝对需要将文件写入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);
}
}
答案 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)
我一直在挖掘,我找到了办法。
经过一些尝试后,我的ROM(更确切地说是/ system文件夹)被严重损坏,我总是看到错误输入:“没有许可” - >用湿巾重新安装ROM
我将文件复制到外部存储(在本例中为/ sdcard,但要注意它可能是另一条路径 - 使用Environment Object来获取路径)。我将所有子文件夹解压缩到主文件夹。
以前的新代码打开了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中有cp
和mv
可以复制/移动文件而无需重新安装/系统(如果是这样,可能只通过{{ 1}}或su mv
)。我不太了解android的这一部分,以确定你是否(或安装你的应用程序的人)也会有这些文件,但值得研究。他们可能需要busybox,我没有调查过。