Android:父进程(app)死后,子进程(logcat)继续运行

hez*_*hez 7 android process logcat

我们的Android应用程序生成一个logcat shell进程,然后读取其结果进行处理.但是,当应用程序停止时(例如,在开发期间重新编译后重新启动时),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();
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

将其添加到测试应用程序的onCreate()方法,启动它,然后使用设置管理器强制停止它.子进程将继续运行,现在父进程为1.

如何杀死Android应用程序启动的logcat进程?有人建议使用ProcessBuilder,但这不是一个解决方案,而且该过程也会继续运行.

父进程停止的Stop子进程中,它被建议使用一个关闭钩子 - 这不起作用,如上所示.

谢谢!

Lek*_*eyn 2

可以做的是生成另一个脚本,其唯一目的是监视您的 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);
Run Code Online (Sandbox Code Playgroud)

这假设您的进程不以 root 身份运行,因此只会终止其自己的 logcat 进程。在你的关闭函数中,你应该首先杀死其他进程(logcat),然后运行p.destroy();来停止这个杀手脚本。

上面的脚本可以通过删除killall. 相反,logcat使用反射获取进程的进程 ID(此答案指向http://www.golesny.de/p/code/javagetpid)并将它们传递给kill.