2

我的应用程序做的第一件事是检查“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。

4

2 回答 2

2

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

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

于 2012-07-10T19:38:43.443 回答
0

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

于 2012-07-09T08:23:51.583 回答