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:
我也檢索到的/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權現在,如果有人有想法,我會非常感激。
解決方法很簡單:不要使用'Runtime.exec()'。沒有命令行程序是Android SDK的一部分。任何你想使用的命令行程序都應該被重寫爲NDK庫,並通過JNI直接從你的Java應用程序調用。 – CommonsWare 2011-05-16 13:34:10
所以我應該用NDK重寫整個ps命令,而不是隻使用5行Runtime.exec? :/ – Lyrkan 2011-05-16 13:47:50
您可以解決任何您嘗試使用的技術解決的問題,這些技術可用於您試圖部署的任何設備。如果這隻適用於您的手機,並且您想使用'ps',則歡迎您將頭靠在牆上以使其正常工作。如果您正在嘗試爲Android電子市場或類似的廣泛分佈構建應用程序,請不要使用'ps',而是以其他方式實現您所需的功能,可能使用NDK。 – CommonsWare 2011-05-16 13:59:16