2011-05-16 71 views
1

我有一個問題,當我使用的Runtime.exec與我的Android設備,只是想不通爲什麼會發生?問題的的Runtime.exec和Android

下面是測試的例子我所做的:

public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Runtime runtime = Runtime.getRuntime(); 
     for(int i=0; i< 20; i++){ 
      Log.d("TESTEXEC", "EXEC N°"+i+" : BEGIN"); 
      try { 
       Process process = runtime.exec("/system/bin/ps"); 
       process.getErrorStream().close(); 
       process.getOutputStream().close(); 
       process.getInputStream().close(); 
       process.waitFor(); 
      } catch (Throwable e) { 
       e.printStackTrace(); 
      } 
      Log.d("TESTEXEC", "EXEC N°"+i+" : END"); 
     } 
    } 
} 

所以,基本上,在這個片段中的作品,它打印此:

EXEC N°0 : BEGIN 
EXEC N°0 : END 
EXEC N°1 : BEGIN 
EXEC N°1 : END 
... 
EXEC N°19 : BEGIN 
EXEC N°19 : END 

但不是說,有時候(它看起來有點隨機),它只是打印

EXEC N°0 : BEGIN 

所有的一切都鎖... 整個事情似乎撞上的Runtime.exec( 「...」),以及process.getErrorStream.close()不會被調用。另一個奇怪的事情:這個錯誤總是發生在第一個exec上。

以下是我與DDMS: DDMS

我也檢索到的/data/anr/traces.txt,但它是不是真的有用:

----- pid 11489 at 2011-05-16 15:15:10 ----- 
Cmd line: com.testexec 

DALVIK THREADS: 
"main" prio=5 tid=1 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4001d8d0 self=0xcca0 
    | sysTid=11489 nice=0 sched=0/0 cgrp=unknown handle=-1345021856 
    at java.lang.ProcessManager.exec(Native Method) 
    at java.lang.ProcessManager.exec(ProcessManager.java:224) 
    at java.lang.Runtime.exec(Runtime.java:196) 
    at java.lang.Runtime.exec(Runtime.java:285) 
    at java.lang.Runtime.exec(Runtime.java:218) 
    at com.testexec.MainActivity.onCreate(MainActivity.java:17) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2629) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2681) 
    at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4641) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 

"java.lang.ProcessManager" daemon prio=5 tid=8 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x460969f0 self=0x240f58 
    | sysTid=11496 nice=0 sched=0/0 cgrp=unknown handle=2363544 
    at java.lang.ProcessManager.watchChildren(Native Method) 
    at java.lang.ProcessManager$1.run(ProcessManager.java:87) 

"Binder Thread #2" prio=5 tid=7 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x460895a0 self=0x1248e0 
    | sysTid=11495 nice=0 sched=0/0 cgrp=unknown handle=1236304 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #1" prio=5 tid=6 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x46086cf8 self=0x143480 
    | sysTid=11494 nice=0 sched=0/0 cgrp=unknown handle=1324096 
    at dalvik.system.NativeStart.run(Native Method) 

"Compiler" daemon prio=5 tid=5 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x46084558 self=0x144560 
    | sysTid=11493 nice=0 sched=0/0 cgrp=unknown handle=1153256 
    at dalvik.system.NativeStart.run(Native Method) 

"JDWP" daemon prio=5 tid=4 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x460842a0 self=0x12dc10 
    | sysTid=11492 nice=0 sched=0/0 cgrp=unknown handle=1152968 
    at dalvik.system.NativeStart.run(Native Method) 

"Signal Catcher" daemon prio=5 tid=3 RUNNABLE 
    | group="system" sCount=0 dsCount=0 s=N obj=0x460841e8 self=0x124d00 
    | sysTid=11491 nice=0 sched=0/0 cgrp=unknown handle=1199296 
    at dalvik.system.NativeStart.run(Native Method) 

"HeapWorker" daemon prio=5 tid=2 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x441e2ee8 self=0x11fdd8 
    | sysTid=11490 nice=0 sched=0/0 cgrp=unknown handle=1185776 
    at dalvik.system.NativeStart.run(Native Method) 

----- end 11489 ----- 

我有點desesperate權現在,如果有人有想法,我會非常感激。

+0

解決方法很簡單:不要使用'Runtime.exec()'。沒有命令行程序是Android SDK的一部分。任何你想使用的命令行程序都應該被重寫爲NDK庫,並通過JNI直接從你的Java應用程序調用。 – CommonsWare 2011-05-16 13:34:10

+1

所以我應該用NDK重寫整個ps命令,而不是隻使用5行Runtime.exec? :/ – Lyrkan 2011-05-16 13:47:50

+0

您可以解決任何您嘗試使用的技術解決的問題,這些技術可用於您試圖部署的任何設備。如果這隻適用於您的手機,並且您想使用'ps',則歡迎您將頭靠在牆上以使其正常工作。如果您正在嘗試爲Android電子市場或類似的廣泛分佈構建應用程序,請不要使用'ps',而是以其他方式實現您所需的功能,可能使用NDK。 – CommonsWare 2011-05-16 13:59:16

回答

5

這很可能是這個Github commit中修復的錯誤。實質上,它直接在fork()之後但在執行實際的exec()之前死鎖,因爲有人試圖使用malloc。