Как программно выполнять сценарии оболочки с командами blktrace в Android?

У меня есть рутованное устройство Android с установленным blktrace. Я хочу выполнить сценарий оболочки для тестирования blktrace из своего приложения. Я пробовал некоторые решения, найденные на некоторых ресурсах в Интернете. Я пробовал эти два метода для выполнения сценариев оболочки.

Способ 1

      fun executeShell(): String {
    val output = StringBuffer()
    val p: Process
    try {
        p = Runtime.getRuntime().exec("path/to/script/file")
        p.waitFor()
        val reader =
            BufferedReader(InputStreamReader(p.inputStream))
        var line = ""
        while (reader.readLine().also { line = it } != null) {
            output.append(line + "n")
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return output.toString()
}

Способ 2

       private fun runAsRoot():Boolean {
    try {
        // Executes the command. /data/app/test.sh
        val process = Runtime.getRuntime().exec("path/to/shellscript/file")
        // Reads stdout.
        // NOTE: You can write to stdin of the command using
        //       process.getOutputStream().
        val reader = BufferedReader(
            InputStreamReader(process.inputStream)
        )
        var read: Int
        val buffer = CharArray(4096)
        val output = StringBuffer()
        while (reader.read(buffer).also { read = it } > 0) {
            output.append(buffer, 0, read)
        }
        reader.close()

        // Waits for the command to finish.
        process.waitFor()
        output.toString()
        Log.e("output", "OUT " + output.toString()).toString()
        isShellRun = true
       
    } catch (e: IOException) {
        isShellRun = false

        throw RuntimeException(e)
    } catch (e: InterruptedException) {
        isShellRun = false

        throw RuntimeException(e)
    }
    return isShellRun
}

Эти методы отлично работают с командами оболочки, как показано ниже, и показывают ожидаемые результаты.

      ls /sdcard/ 
cat /proc/cpuinfo

Я хочу выполнить некоторые команды, например, но они не выполняются через мое приложение. Но я могу отлично выполнить эту команду через оболочку adb с разрешением su root.

Как я могу выполнять такие команды, как blktrace -d /dev/block/sda -w 30 -D /sdcard/blktrace_app_runsиз моего приложения?

1 ответ

Я думаю, вам нужно что-то вроде этого массива строк для вашей команды.

          private static final String processId = Integer.toString(android.os.Process
                .myPid());
    
   String[] command = new String[] { "logcat", "-d", "threadtime" };
   Process process = Runtime.getRuntime().exec(command);

Мой ответ можно найти здесь: /questions/18311833/chitajte-logi-iz-koda-programmno-i-sopostavlyaya-ih-so-strokoj-v-prilozhenii-dlya-android/18311851#18311851

Другие вопросы по тегам