Запуск команд оболочки через 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();
}

Но мой логарифм показывает, что только два из них не отклоняются.

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, когда я запускаю этот код. Я новичок в работе с root-файлами, и я не могу понять, как заставить это работать.


person Ben    schedule 30.07.2011    source источник
comment
Могу ли я получить рабочий проект этого образца?   -  person Manoj Kumar    schedule 26.09.2012
comment
У меня это не работает, и я не получаю никаких исключений FileNotFound или чего-либо еще в Java. Кроме того, SuperSU перехватывает корневой запрос, и я могу его удовлетворить, поэтому я знаю, что getRuntime() работает. По какой-то причине он просто не позволяет мне манипулировать файлами в папке /system/media.   -  person anon58192932    schedule 14.03.2013
comment
Ах, похоже, что sysrw и sysro - неизвестные коммандеры.   -  person anon58192932    schedule 14.03.2013
comment
Извините за наивный вопрос: это работает только с рутированным устройством, не так ли?   -  person Diana    schedule 24.10.2013


Ответы (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"};
person user496854    schedule 30.07.2011
comment
Когда я помещаю это в свой onClick, он говорит, что () (String [] cmds) должен быть;, что просто добавляет больше ошибок, когда я это делаю. - person Ben; 31.07.2011
comment
Я только что отредактировал свой исходный ответ, чтобы показать пример массива строк, который необходимо передать в - person user496854; 01.08.2011
comment
Если я не делаю это неправильно, он выделяет RunAsRoot и говорит, что void - недопустимый тип для RunAsRoot. Я обновил свой вопрос кодом, который у меня есть сейчас - person Ben; 01.08.2011
comment
Вы не можете передать такой массив строк. Вы должны сначала назначить его, а затем передать как переменную. Функция RunAsRoot должна быть идентична той, что я опубликовал - person user496854; 02.08.2011
comment
Интересно, почему ввод осуществляется через outputstream, а вывод через inputstream, проблема с именованием? - person S.D.; 29.04.2013
comment
Можно ли получить результат только что выполненной команды ..? например ls / data - person 3lokh; 26.05.2015
comment
Приведенный выше код не работает с устройствами без рута. - person vgokul129; 03.01.2017