Запись файла в системный раздел - PullRequest
4 голосов
/ 24 октября 2011

Я пытаюсь записать файл, сгенерированный моим приложением, в системный раздел. Поскольку я не могу создать 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" });

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Я предполагаю, что только первый вызов Runtime.exec():

r.exec("su");

получает root.Документы для Runtime.exec() говорят, что каждый вызов выполняется как отдельный процесс.Таким образом, все последующие вызовы exec для chown, chmod, mv все выполняются с разрешениями текущего процесса приложения и, следовательно, завершаются неудачей.

Возможно, вы сможете написатьнебольшой сценарий оболочки, затем передайте сценарий оболочки в качестве аргумента su.Тогда все команды будут запускаться с правами root.

1 голос
/ 02 ноября 2011

ОК, я нашел, как выполнять несколько команд с правами 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 - это будет проверено.

...