7

Android アプリは logcat シェル プロセスを生成し、その結果を読み取って処理します。ただし、アプリが停止した場合 (開発中の再コンパイル後に再起動した場合など)、logcat プロセスは実行され続けます。この動作の例を次に示します。

processes = new ArrayList<Process>();

try {
  processes.add(Runtime.getRuntime().exec("logcat -v time"));
  processes.add(Runtime.getRuntime().exec("logcat -v time"));
  processes.add(Runtime.getRuntime().exec("logcat -v time"));
  processes.add(Runtime.getRuntime().exec("logcat -v time"));
} catch (IOException e) {
  // oh no!
}

Runtime.getRuntime().addShutdownHook(new Thread() {
  public void run() {
    for (Process p : processes) {
      p.destroy();
    }
  };
});

これをテスト アプリの onCreate() メソッドに追加して起動し、設定マネージャーを使用して強制停止します。子プロセスは引き続き実行され、親 ID は 1 になります。

Androidアプリケーションによって開始されたlogcatプロセスを強制終了するには? ProcessBuilder を使用することが提案されましたが、それは解決策ではなく、プロセスも実行され続けます。

親プロセスが停止したときに子プロセスを停止する」では、シャットダウン フックを使用することが推奨されていましたが、上記のように機能しません。

ありがとう!

4

1 に答える 1

1

あなたができることは、Java プログラムを監視することだけを目的とした別のスクリプトを生成することです。それが死ぬたびに、その子もすべて殺します。

脆弱な例:

int pid = android.os.Process.myPid();
String script = "while [ -d /proc/" + pid + " ];do sleep 1;done; killall logcat";
Process p = Runtime.getRuntime().exec("/system/bin/sh", "-c", script);

これは、プロセスがルートとして実行されないことを前提としているため、独自の logcat プロセスのみを強制終了します。シャットダウン関数では、最初に他のプロセスを強制終了し ( logcat)、実行p.destroy();してこのキラー スクリプトを停止する必要があります。

上記のスクリプトは、 の使用を削除することで改善できますkillalllogcat代わりに、リフレクションを使用してプロセスのプロセス ID を取得し(この回答はhttp://www.golesny.de/p/code/javagetpidを指しています)、それらを に渡しますkill

于 2013-11-26T23:37:39.067 に答える