【问题标题】:How to kill logcat process initiated by Android application?如何杀死Android应用程序启动的logcat进程?
【发布时间】:2012-10-17 18:24:07
【问题描述】:

我有 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 进程列表。我怎样才能杀死他们?

任何想法

【问题讨论】:

    标签: android process


    【解决方案1】:

    由于您拥有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();
    ...
    

    【讨论】:

    • 这是个问题,我的设备没有root 我不能用kill 命令杀死进程,没有权限
    • process.destry() 不能正常工作,它告诉我已成功杀死但进程仍在运行。我想到了检查 logcat 是否运行并尝试使用它来构建新的场景
    • 该问题可能与您开始该过程的方式有关。请看documentation for Process;具体来说,概述中给出的代码 sn-p 使用了ProcessBuilder
    • 感谢@acj,我找到了可以在您的帮助下使用的解决方案。 ` ProcessBuilder pb = new ProcessBuilder("logcat", "-v", "time", "-s", arg); pb.redirectErrorStream(true);进程 logcatProcess = pb.start(); ...`
    • Maxim,ProcessBuilder 对您有何帮助?我和你有同样的问题 - 请参阅stackoverflow.com/questions/16173387/… - 在我的情况下使用 ProcessBuilder 不是解决方案,logcat 只是继续运行。
    【解决方案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 日志记录时,它将从同一时间开始,而不会添加以前日志中的重复值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多