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