【问题标题】:Runtime.exec() bug: hangsRuntime.exec() 错误:挂起
【发布时间】:2012-07-09 08:06:12
【问题描述】:

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

【问题讨论】:

    标签: android runtime.exec


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 请查看示例代码和我发布的 stackoverflow 链接。问题是 exec(..) 永远不会返回。 FutureTask 只是检测此类问题的包装器。如果它不挂在那里,就根本不需要 FutureTask。
      • PS:这段代码只是启动进程,处理(例如读取流和做东西)是在之后完成的。在 github 上查看完整的测试应用程序(链接已发布)
      • 快速浏览了一下。你确定你的 FutureTask 实际上正在执行吗?不记得确切的细节,但我认为您需要使用 ExecutorService 执行它
      • 是的,这是测试应用程序中的一个错误(来自真实应用程序的错误复制意大利面)。我现在解决了这个问题,但挂起 exec(..) 调用的问题在随机情况下仍然存在。
      • 这确实很奇怪。您确定阻塞实际上是在 Runtime.exec() 方法中吗?
      猜你喜欢
      • 2012-01-31
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2021-01-26
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多