3

こんにちは、iperf を使用してネットワーク スループットをテストしています。そのために、NDK を使用して iperf c コードの実行可能ファイルを作成しています。次のようにプロセスを正常に起動できます。

 Process process ;
 process = new ProcessBuilder().command(commandList).redirectErrorStream(true).start();

しかし、私の懸念は、ある時点でアプリケーションがクラッシュした場合 (クラッシュはありませんが、クラッシュした場合)、外部プロセスが実行され続けるため、いつでもこのプロセスを破棄する方法が必要です。あらゆる活動またはサービス。したがって、誰かが何か考えを持っている場合は、助けてください。

4

1 に答える 1

1

JVM ランドでの通常の解決策は を使用することRuntime.addShutdownHookですが、Android バージョンには次の警告が表示されます。

Android では、アプリケーションのライフサイクルに VM の終了が含まれないため、このメソッドを呼び出してもコードが実行されるとは限らないことに注意してください。代わりに、最も適切なライフサイクル通知 (Activity.onPause など) を使用する必要があります。

クラッシュが気になるので、クラッシュする可能性のあるスレッドにキャッチされていない例外ハンドラーを設定して、子プロセスも強制終了できます (参照Thread.setUncaughtExceptionHandler)。

それとは別に、PID がわかっている場合はkill、シグナルを送信するために使用できます (pkill がないため)。あなたはやろうとすることができますRuntime.getRuntime().exec("kill -SIGINT <PID-goes-here>");

PID がない場合、Android の標準イメージには のバージョンが付属してpsいますが、残念ながらそれがサポートする構文が不明であるため、代わりにその出力を解析することをお勧めします。(また、それが基本イメージに含まれているという事実から、OEM ビルドにも含まれていると思われます)。

しかし、はい、これはプロセスを停止するための不必要に難しい方法です。これは、JVM っぽいものを使用するために支払わなければならない代償です。外部プロセスを開始するのではなく、JNI ブリッジを構築する必要があります。

于 2013-04-26T14:23:18.260 に答える