2012-07-09 101 views
2

我的應用程序所做的第一件事是檢查「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。

回答

2

3c71說得對打開的文件描述符。就我而言,AdMob SDK導致了這個問題,因爲它有時會在我試圖調用exec(..)的時候從Web上重新加載廣告,讓我陷入僵局。

我的解決方案是分叉一個「蘇」過程一次,並重復使用它的所有命令,並加載廣告後分叉的過程。

0

要使用的Runtime.exec安全,你應該等待進程結束和消費的輸出和錯誤流,最好同時(防止攔截): http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

+0

請看我已發佈的示例代碼和stackoverflow鏈接。問題是,exec(..)永遠不會返回。 FutureTask只是一個包裝來檢測這種問題。如果它不掛在那裏,FutureTask根本就不需要。 – chrulri 2012-07-09 08:37:59

+0

PS:這段代碼剛剛開始這個過程,之後完成處理(例如讀取流和執行內容)。看看github上的完整測試應用程序(鏈接已張貼) – chrulri 2012-07-09 08:53:56

+0

快速瀏覽。你確定你的FutureTask實際上正在執行?不記得確切的細節,但我認爲你需要使用ExecutorService執行它 – 2012-07-09 09:04:54