Запуск команд оболочки через Java-код на Android?
У меня есть приложение, которое должно использовать некоторые команды оболочки для копирования файла с SD-карты в /system/media/. Это потребует root, и я тестирую на рутованном устройстве. Я использую среды выполнения для выполнения команд оболочки, но это не работает. Вот то, что я получил за время выполнения
public void RunAsRoot{String[] commands = {"sysrw", "rm /data/local/bootanimation.zip", "sysro"};{
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String tmpCmd : commands) {
os.writeBytes(tmpCmd+"\n");
}
os.writeBytes("exit\n");
os.flush();
}
Но мой logcat показывает только два из них, не получая отказ
07-30 03:14:11.112: WARN/su(3593): request rejected (10047->0 /system/bin/sh)
07-30 03:14:11.132: DEBUG/su(3592): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh
07-30 03:14:11.152: WARN/su(3594): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.182: WARN/su(3595): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.202: WARN/su(3596): request rejected (0->0 /system/bin/sh)
07-30 03:14:11.242: DEBUG/su(3597): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh
Эти две команды выглядят как команды sysrw и sysro, но приложение все еще запрашивает разрешение root, когда я запускаю этот код. Я новичок в работе с рутом и не могу понять, как заставить это работать.
1 ответ
Решение
Для запуска корневых команд вы должны использовать следующий формат:
public void RunAsRoot(String[] cmds){
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String tmpCmd : cmds) {
os.writeBytes(tmpCmd+"\n");
}
os.writeBytes("exit\n");
os.flush();
}
где вы передаете массив строк, каждая из которых является командой, которую нужно выполнить. Например:
String[] commands = {"sysrw", "rm /data/local/bootanimation.zip", "sysro"};