7

我们的 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() 方法中,启动它,然后使用设置管理器强制停止它。子进程将继续运行,现在其父 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);

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

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

于 2013-11-26T23:37:39.067 回答