在Android Studio上运行终端命令

时间:2018-09-08 16:23:13

标签: android shell android-studio terminal runtime.exec

我正在尝试制作一个允许我切换手机缩放比例调节器的应用程序(是的,我已经扎根了)。经过大量搜索之后,我发现通常需要关闭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 :(得分:1)

这是我用于我的应用的代码:

['ABC123', 'PRINTING', 'AUDIT', 'SAMPLE', '10'], ['CDE123', 'AUDIT', 'APPROVED', 'ORDER', '1']

它在Kotlin中,但是很容易转换成Java。

我相信关键部分是使用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() } } 开始新的流程(exec())。然后,该函数将您发送的命令写入到OutputStream,以便在su进程下运行它们。

如果您的应用正在挂起,请确保您使用任何管理员(Magisk,SuperSU等)授予其根访问权限。