Runtime.exec()bug:挂起

时间:2012-07-09 08:06:13

标签: android runtime.exec

我的应用程序做的第一件事是检查“su”,因为应用程序必须工作。即使它有时工作,通常在终端中输入“killall packageName ”之后。我做了一个简单的测试应用程序,每次都无法让它工作。 代码发生的地方:

String[] args = new String[] { "su" };
Log.v(TAG, "run(" + Arrays.toString(args) + ")");
FutureTask<Process> task = new FutureTask<Process>(new Callable<Process>() {
    @Override
    public Process call() throws Exception {
        return Runtime.getRuntime().exec(args);
    }
});
try {
    Executors.newSingleThreadExecutor().execute(task);
    return task.get(10, TimeUnit.SECONDS);
} catch (Throwable t) {
    task.cancel(true);
    throw new IOException("failed to start process within 10 seconds", t);
}

完成项目:https://github.com/chrulri/android_testexec

由于这个应用程序只是首先运行exec(),我无法关闭任何以前打开的文件描述符,如另一个stackoverflow问题中所述:https://stackoverflow.com/a/11317150/1145705

PS:我在不同设备上运行Android 4.0.3 / 4.0.4。

2 个答案:

答案 0 :(得分:2)

3c71关于打开文件描述符是正确的。在我的情况下,AdMob SDK导致了这些问题,因为它有时(重新)在网络上加载广告时,我试图调用exec(..)让我陷入僵局。

我的解决方案是分叉一个“su”进程ONCE并将其重用于所有命令并加载广告AFTER分支该进程。

答案 1 :(得分:0)

要安全地使用Runtime.exec,您应该等待进程完成并使用输出和错误流,最好是同时进行(以防止阻塞): http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html