【问题标题】:Android IO Exception when trying to execute a process尝试执行进程时出现Android IO异常
【发布时间】:2012-05-22 01:38:07
【问题描述】:

我有以下代码,用于从 PID 中获取应用程序名称。
shell命令是(只是为了显示它在shell提示符下有效,我修剪了很多行,它们看起来都很相似)

C:\android-sdk-windows\platform-tools>adb shell ps
USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
root      1     0     312    220   c009b74c 0000ca4c S /init
root      2     0     0      0     c004e72c 00000000 S kthreadd
root      3     2     0      0     c003fdc8 00000000 S ksoftirqd/0
root      4     2     0      0     c004b2c4 00000000 S events/0
root      27    1     740    316   c0158eb0 afd0d8ac S /system/bin/sh
system    28    1     812    292   c01a94a4 afd0db4c S /system/bin/servicemanager
root      29    1     3736   568   ffffffff afd0e1bc S /system/bin/vold
system    68    33    191096 38680 ffffffff afd0db4c S system_server
radio     131   33    147680 22868 ffffffff afd0eb08 S com.android.phone
app_25    134   33    148784 25740 ffffffff afd0eb08 S com.android.launcher
app_0     160   33    135560 20956 ffffffff afd0eb08 S android.process.acore
root      316   40    740    332   c003da38 afd0e7bc S /system/bin/sh
root      317   316   888    336   00000000 afd0d8ac R ps

我的java代码是:

private static Pattern pidPattern = Pattern.compile("(\\d+).+?\\s+[DNRSTZ]\\s+(.+)$");

private final Map<Integer, String> pidNames = new HashMap<Integer, String>();

private void getAppNames() {
    // Bad command: String commandLine = "adb shell ps";
    String line;
    try {
        Process process = Runtime.getRuntime().exec("ps");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        Matcher matcher;

        pidNames.clear();
        while((line = bufferedReader.readLine()) != null) {
            matcher = pidPattern.matcher(line);
            if(matcher.find()) {
                int pid = Integer.valueOf(matcher.group(1));
                String name = matcher.group(2);
                pidNames.put(pid, name);
                Log.i(TAG, "Pid=" + pid + " Name=" + name);
            }
        }
        bufferedReader.close();
        process.destroy();
    }
    catch (IOException e) {
        Log.e(TAG, "getAppNames failed", e);
    }
}

我收到以下消息:

05-14 17:09:00.220: E/BackTask(698): getAppNames failed
05-14 17:09:00.220: E/BackTask(698): java.io.IOException: Error running exec(). Command: [adb shell ps, android.com] Working Directory: null Environment: [ANDROID_SOCKET_zygote=10, ANDROID_BOOTLOGO=1, EXTERNAL_STORAGE=/mnt/sdcard, ANDROID_ASSETS=/system/app, ASEC_MOUNTPOINT=/mnt/asec, PATH=/sbin:/system/sbin:/system/bin:/system/xbin, ANDROID_DATA=/data, BOOTCLASSPATH=/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar, ANDROID_PROPERTY_WORKSPACE=9,32768, ANDROID_ROOT=/system, LD_LIBRARY_PATH=/system/lib]
05-14 17:09:00.220: E/BackTask(698):    at java.lang.ProcessManager.exec(ProcessManager.java:226)
05-14 17:09:00.220: E/BackTask(698):    at java.lang.ProcessBuilder.start(ProcessBuilder.java:201)
05-14 17:09:00.220: E/BackTask(698):    at com.delta.app.BackTask.getAppNames(BackTask.java:180)
05-14 17:09:00.220: E/BackTask(698):    at com.delta.app.BackTask.doInBackground(BackTask.java:65)
05-14 17:09:00.220: E/BackTask(698):    at com.delta.app.BackTask.doInBackground(BackTask.java:1)
05-14 17:09:00.220: E/BackTask(698):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-14 17:09:00.220: E/BackTask(698):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-14 17:09:00.220: E/BackTask(698):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-14 17:09:00.220: E/BackTask(698):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
05-14 17:09:00.220: E/BackTask(698):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
05-14 17:09:00.220: E/BackTask(698):    at java.lang.Thread.run(Thread.java:1096)
05-14 17:09:00.220: E/BackTask(698): Caused by: java.io.IOException: Permission denied
05-14 17:09:00.220: E/BackTask(698):    at java.lang.ProcessManager.exec(Native Method)
05-14 17:09:00.220: E/BackTask(698):    at java.lang.ProcessManager.exec(ProcessManager.java:224)
05-14 17:09:00.220: E/BackTask(698):    ... 10 more

问题是:怎么了?没有权限?进程调用自己?

编辑: 试了下:

Process process = Runtime.getRuntime().exec(commandLine);

同样的 IOException 结果

【问题讨论】:

    标签: android process ioexception


    【解决方案1】:

    在 Android 操作系统中运行命令行时,不应执行“adb shell ps”;你应该只执行“ps”!

    设备端没有“adb”可执行文件。

    此外,生成进程的更好方法如下:

    process = Runtime.getRuntime().exec("ps");

    【讨论】:

    • 和往常一样,我觉得自己像个傻瓜一样没有注意到它!它是如此简单,但我在发布之前浪费了两个小时弄清楚它,而我距离答案还有 9 个字符。
    猜你喜欢
    • 2019-01-15
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多