4

我有 Android 应用程序,它在服务启动时实现了以下代码:

...
Process process = Runtime.getRuntime().exec("logcat -v time -s " + arg);
BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(process.getInputStream()));
...

如您所见,我启动 logcat 进程以侦听日志。不幸的是,停止服务不会停止 logcat 并且在几次启动后我得到:

app_125   4782  144   137124 30584 ffffffff 00000000 S com.wefi.agnt.ui
app_125   4796  4782  1028   592   ffffffff 00000000 S logcat
app_125   4839  4782  1076   640   ffffffff 00000000 S logcat
app_125   4842  4782  952    516   ffffffff 00000000 S logcat
app_125   4845  4782  896    460   ffffffff 00000000 S logcat
app_125   4848  4782  900    464   ffffffff 00000000 S logcat
app_125   4851  4782  876    440   ffffffff 00000000 S logcat
shell     4852  171   788    336   c00cc7e4 afd0c78c S /system/bin/sh
shell     4853  4852  944    332   00000000 afd0b83c R ps
app_123   11189 144   114484 18908 ffffffff 00000000 S com.mspot.android.moviesClub.att  

... logcat 进程列表。我怎么能杀了他们?

有任何想法吗

4

2 回答 2

2

由于您拥有Process实例的句柄,因此您应该可以process.destroy()在停止服务时使用。Logcat 进程独立于您的应用程序运行,因此它们将在您的应用程序Service停止运行后继续运行,除非您终止它们。

如果您只是想在测试应用程序时清理设备上的进程,您可以运行adb shell以在设备上获取 shell 提示,然后使用kill <PID>来终止进程。

编辑

Process文档还指定您应该使用它ProcessBuilder来设置和运行该过程:

ProcessBuilder pb = new ProcessBuilder("logcat", "-v", "time", "-s", arg);
pb.redirectErrorStream(true);
Process process = pb.start();
...
于 2012-10-17T18:54:43.337 回答
2

首先要启动 adb logging,创建一个进程:

 String cmd1 = "logcat -v time -f" + filename.getAbsolutePath();
 Process logcat = Runtime.getRuntime().exec(cmd1);

在此之后,每当您想停止 adb 更新以写入文件时,只需调用:

 String cmd = "logcat -c";
    try {
        logcat.destroy();
        logcat = Runtime.getRuntime().exec(cmd);
    } catch (IOException e) {
        e.printStackTrace();
    }

这将破坏之前的构建过程,并清除之前记录的所有 adb 日志。因此,当您再次启动 adb 日志记录时,它将从同一时间开始,而不会添加先前日志中的重复值。

于 2017-04-12T08:51:22.327 回答