Как программно выполнять сценарии оболочки с командами 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