Выполнение сценария оболочки в приложении Android - PullRequest
2 голосов
/ 16 октября 2011

Простите, я не программист ядра Linux. Это мой первый раз, когда я пишу код в Linux, так что держись со мной.

Итак, я прочитал тонны постов по этой теме, и у меня возникли проблемы с выяснением того, что происходит с моим кодом. По сути, я пытаюсь создать приложение Profiles. Устройство рутировано и содержит BusyBox. Я написал скрипт linux, который меняет разделы / data и / cache в зависимости от пользователя, который входит в систему.

Когда я выполняю этот скрипт из ADB, он работает отлично. Я подумал, что реализовать его в приложении будет довольно просто.

# sp логин логин пароль

Android переинициализируется с новым профилем и все хорошо. Вот что у меня в Android:

Log.v("Profiles", "sp login " + user + " " + password);
Process process = Runtime.getRuntime().exec("sp login " + user + " " + password);

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
    output.append(buffer, 0, read);
}
reader.close();
process.waitFor();
Log.v("Profiles", output.toString());

Единственный выход, который регистрируется, - это мое "эхо" в самом скрипте. Я не вижу результатов от команд, выполненных в этом сценарии. Например, при запуске в ADB выводятся все команды монтирования и разные вещи, которые я делаю. Ничего из этого не выводится в выходной строке.

Есть предложения?

1 Ответ

0 голосов
/ 09 декабря 2014

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

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

приведенный ниже код является примером для справки.

public void RunAsRoot(String[] cmds){
    try{
        Process p = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(p.getOutputStream());
        for(String tmpCmds : cmds){
            os.writeBytes(tmpCmds+"\n");
            os.flush();
            os.writeBytes("exit\n");
            os.flush();
        }
        BufferedReader stdInput = new BufferedReader(new 
            InputStreamReader(p.getInputStream()));

       // read the output from the command
       String s = null;
       while ((s = stdInput.readLine()) != null) {
           System.out.println(s);
       }
    }catch(Exception e){
        Log.e(LOG_TAG, "RunAsRoot exec failed");
    }

}

...