【问题标题】:Running adb commands within app gives Permission denied在应用程序中运行 adb 命令会导致权限被拒绝
【发布时间】:2016-12-12 16:01:47
【问题描述】:

我正在构建一个应用程序,它试图执行一些命令,例如“top”和其他命令。 我正在开发 android 7.0。 我在较旧的 android 版本中尝试此代码,但是当我在牛轧糖上尝试时,我收到以下 Permission denied 错误:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
              Process: com.example.matant.cmdlineapp, PID: 7662
              java.lang.RuntimeException: An error occurred while executing doInBackground()
                  at android.os.AsyncTask$3.done(AsyncTask.java:325)
                  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                  at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                  at java.lang.Thread.run(Thread.java:761)
               Caused by: java.lang.RuntimeException: java.io.IOException: Cannot run program "adb shell top": error=13, Permission denied
                  at com.example.matant.cmdlineapp.MainActivity$RunningTopCommand.doInBackground(MainActivity.java:88)
                  at com.example.matant.cmdlineapp.MainActivity$RunningTopCommand.doInBackground(MainActivity.java:36)
                  at android.os.AsyncTask$2.call(AsyncTask.java:305)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                  at java.lang.Thread.run(Thread.java:761) 
               Caused by: java.io.IOException: Cannot run program "adb shell top": error=13, Permission denied
                  at java.lang.ProcessBuilder.start(ProcessBuilder.java:983)
                  at com.example.matant.cmdlineapp.MainActivity$RunningTopCommand.doInBackground(MainActivity.java:62)
                  at com.example.matant.cmdlineapp.MainActivity$RunningTopCommand.doInBackground(MainActivity.java:36) 
                  at android.os.AsyncTask$2.call(AsyncTask.java:305) 
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                  at java.lang.Thread.run(Thread.java:761) 
               Caused by: java.io.IOException: error=13, Permission denied
                  at java.lang.UNIXProcess.forkAndExec(Native Method)
                  at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
                  at java.lang.ProcessImpl.start(ProcessImpl.java:128)
                  at java.lang.ProcessBuilder.start(ProcessBuilder.java:964)
                  at com.example.matant.cmdlineapp.MainActivity$RunningTopCommand.doInBackground(MainActivity.java:62) 
                  at com.example.matant.cmdlineapp.MainActivity$RunningTopCommand.doInBackground(MainActivity.java:36) 
                  at android.os.AsyncTask$2.call(AsyncTask.java:305) 
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                  at java.lang.Thread.run(Thread.java:761) 

我正在执行的代码是:

protected Void doInBackground(String... params) {
        //Execution en BackGround
        Log.d("BACKGROUND", "START");
        Log.d("BACK PARAM 0", params[0]);
        //Log.d("BACK PARAM 1", params[1]);

        try {
            // Executes the command.
            //Process process = Runtime.getRuntime().exec("adb version");
            ProcessBuilder processBuilder = new ProcessBuilder("adb shell top");
            Process process = processBuilder.start();

            // Reads stdout.
            // NOTE: You can write to stdin of the command using
            //       process.getOutputStream().
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));

            int read;
            char[] buffer = new char[4096];
            StringBuffer output = new StringBuffer();
            while ((read = reader.read(buffer)) > 0) {
                output.append(buffer, 0, read);
                Log.d("reader val: ",output.toString());
                publishProgress(output.toString());
            }
            reader.close();

            return null;

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

【问题讨论】:

    标签: android


    【解决方案1】:

    来自this

    /sys 和 /proc 以泄露边信道信息而闻名 关于进程,可用于推断状态的信息 过程。例如,多年来一直有记录表明 /proc 访问可用于监控应用程序启动,启用网络钓鱼 攻击。

    因此,随着 N 的发布,开发团队有意限制了 /sys 和 /proc 的访问。如果我没记错的话,adb top 命令也完全依赖于读取/proc 的状态。这是,我认为,因此不可能通过ProcessBuilder 执行top 命令而不遇到从Android N 开始的权限被拒绝错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多