我的应用程序做的第一件事就是检查"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);
}完整项目:testexec
由于这个应用程序一开始只运行exec(),我无法关闭以前打开的任何文件描述符,就像在另一个堆栈溢出问题:https://stackoverflow.com/a/11317150/1145705中提到的那样
PS:我在不同的设备上运行Android4.0.3/ 4.0.4。
发布于 2012-07-10 19:38:43
3c71关于开放的文件描述符是正确的。在我的例子中,是AdMob SDK引起了问题,因为在我试图调用exec(.)的时候,它有时会(重新)从网络上加载广告。让我陷入僵局。
我的解决方案是一次分叉一个"su“进程,并将它重用到所有命令中,并在分叉该进程之后加载广告。
发布于 2012-07-09 08:23:51
要安全地使用Runtime.exec,您应该等待进程完成并使用输出流和错误流,最好是并发(以防止阻塞):http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
https://stackoverflow.com/questions/11391177
复制相似问题