如何以编程方式在android中使用blktrace命令执行shell脚本?

Posted

技术标签:

【中文标题】如何以编程方式在android中使用blktrace命令执行shell脚本?【英文标题】:How to execute shell scripts with blktrace commands in android programmatically? 【发布时间】:2021-05-08 14:59:27 【问题描述】:

我有一个安装了 blktrace 的根 android 设备。我想从我的应用程序中执行一个 shell 脚本来测试 blktrace。我尝试了一些在互联网上的一些资源中找到的解决方案。这两种执行shell脚本的方法我都试过了

方法一

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()

方法二

 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

这些方法适用于如下 shell 命令并显示预期输出

ls /sdcard/ 
cat /proc/cpuinfo

我想执行一些命令,例如blktrace -d /dev/block/sda -w 30 -D /sdcard/blktrace_app_runs,但它不能通过我的应用程序执行。但是我可以通过具有su root权限的adb shell完美地执行这个命令。

如何从我的应用程序中执行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);

我的答案可以在这里找到:https://***.com/a/37720611/3806413

【讨论】:

以上是关于如何以编程方式在android中使用blktrace命令执行shell脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何仅以编程方式在android中添加动态网格布局?

如何以编程方式在android中使用blktrace命令执行shell脚本?

如何以编程方式在 Android 中包含布局?

如何以编程方式(使用 Intent)在 Android 中打开 My Files 文件夹?

如何在android中以编程方式启用位置访问?

如何以编程方式在 Android Q 中打开设置面板?