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

时间:2013-04-23 15:29:33

标签: 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();
    }
  };
});

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

How to kill logcat process initiated by Android application?中,建议使用ProcessBuilder,但这不是解决方案,而且流程也将继续运行。

Stop child process when parent process stops中,建议使用关闭钩子 - 如上所示,它不起作用。

谢谢!

1 个答案:

答案 0 :(得分:1)

每当它死亡时,也杀死它的所有孩子。

一个脆弱的例子:

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);

这假设您的进程不以root身份运行,因此只会终止其自己的logcat进程。在关机功能中,您应首先终止其他进程(logcat),然后运行p.destroy();以停止此杀手级脚本。

通过删除killall的使用,可以改进上述脚本。相反,请使用反射(this answer指向http://www.golesny.de/p/code/javagetpid)获取logcat进程的进程ID,并将其传递给kill