我的應用程序所做的第一件事是檢查「su」,因爲它是必要的應用程序工作。即使它有時可以工作,通常在終端中輸入「killall packageName」後。我已經完成了一個簡單的測試應用程序,並且我無法每次都使用它。Runtime.exec()bug:掛起
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(),在另一計算器提到我無法關閉任何先前打開的文件描述符問題:https://stackoverflow.com/a/11317150/1145705
PS:我在不同的設備上運行Android 4.0.3/4.0.4。
請看我已發佈的示例代碼和stackoverflow鏈接。問題是,exec(..)永遠不會返回。 FutureTask只是一個包裝來檢測這種問題。如果它不掛在那裏,FutureTask根本就不需要。 – chrulri 2012-07-09 08:37:59
PS:這段代碼剛剛開始這個過程,之後完成處理(例如讀取流和執行內容)。看看github上的完整測試應用程序(鏈接已張貼) – chrulri 2012-07-09 08:53:56
快速瀏覽。你確定你的FutureTask實際上正在執行?不記得確切的細節,但我認爲你需要使用ExecutorService執行它 – 2012-07-09 09:04:54