Запуск терминальных команд в Android Studio - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь создать приложение, которое позволяет переключать регуляторы масштабирования моего телефона (да, я рутирован). После долгих поисков я обнаружил, что, как правило, мне нужно выполнить команду off process = Runtime.getRuntime().exec(cmd);

Однако после многих попыток приложение, похоже, не отвечает должным образом. Пока это мой код.

    String RunCommand(String cmd) {
    StringBuffer cmdOut = new StringBuffer();
    Process process;
    try{
        process = Runtime.getRuntime().exec(cmd);
        InputStreamReader r = new InputStreamReader(process.getInputStream());
        BufferedReader bufReader = new BufferedReader(r);
        char[] buf = new char[4096];
        int nRead = 0;
        while ((nRead = bufReader.read(buf)) > 0){
            cmdOut.append(buf, 0, nRead);
        }
        bufReader.close();
        try {
            process.waitFor();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }catch (IOException e) {
        e.printStackTrace();
    }
    return cmdOut.toString();
}

На самом деле мне не нужен выходной файл, так как команды, которые я выполняю, на самом деле не нуждаются в выводе. т.е. echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Когда я запускаю приложение, оно либо зависает, либо просто ничего не делает. Не уверен, что я делаю не так? Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 08 сентября 2018

Это код, который я использую для своих приложений:

fun sudo(vararg strings: String) {
    try {
        val su = Runtime.getRuntime().exec("su")
        val outputStream = DataOutputStream(su.outputStream)

        for (s in strings) {
            outputStream.writeBytes(s + "\n")
            outputStream.flush()
        }

        outputStream.writeBytes("exit\n")
        outputStream.flush()
        try {
            su.waitFor()
        } catch (e: InterruptedException) {
            e.printStackTrace()
        }

        outputStream.close()
    } catch (e: IOException) {
        e.printStackTrace()
    }

}

Он в Котлине, но его легко конвертировать в Java.

Ключевая часть, я полагаю, запускает ваш новый Процесс (exec()) с su. Затем функция записывает команды, отправленные вами в OutputStream, поэтому она запускает их в процессе su.

Если ваше приложение зависает, убедитесь, что вы предоставляете ему root-доступ с любым менеджером, который вы используете (Magisk, SuperSU и т. Д.).

...