【问题标题】:How do I properly capture the logcat using a process and filtering on PID?如何使用进程和过滤 PID 正确捕获 logcat?
【发布时间】:2020-08-19 21:59:12
【问题描述】:

看起来很简单。

我正在使用Runtime.getRuntime().exec(commandString);

我试过了

String commandString = "logcat -v raw --pid=" + PID);
Runtime.getRuntime().exec(commandString);

我已经在没有-v raw 的情况下进行了尝试,并且还尝试(并且需要)使用| 来使用多个PID。 似乎没有任何效果。我有一个new BufferedReader(new InputStreamReader(p.getInputStream())); 什么也得不到。如果我不对 PID 进行过滤,它可以工作,但会打印出所有命中 logcat 的东西,这不是很有用。

我错过了什么?

这是重要部分的全部内容。

        try {
            Runtime.getRuntime().exec("logcat -c").waitFor();

            StringBuilder pids = new StringBuilder("");
            for (int i = 0; i < PIDs.size(); i++){
                pids.append(Integer.toString(PIDs.get(i)));
                if (i < PIDs.size() - 1){
                    pids.append("|");
                }
            }
            String commmandString = "logcat -v raw --pid=" + pids);
            p = Runtime.getRuntime().exec(commmandString);
            mBufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));

        } catch (IOException e) {} catch (InterruptedException e) {}
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                p.destroy();
            };
        });

        mThreadAlive = true;
        mLoggingThread.start();

【问题讨论】:

    标签: java android logcat pid


    【解决方案1】:

    这应该可以帮助您将输出重定向到 InputStream(您可以将其包装在 BufferedReader 中):

            String[] argv =
                new String[] { "logcat", "-v", "raw", "--pid=" + pid };
            Process process =
                new ProcessBuilder(argv)
                .inheritIO()
                .redirectOutput(ProcessBuilder.Redirect.PIPE)
                .start();
    
            try (InputStream in = process.getInputStream()) {
                // Consume InputStream
    
                int status = process.waitFor();
    
                if (status != 0) {
                    throw new IOException(argv + " returned exit status " + status);
                }
            }
    

    【讨论】:

    • 由于 J 中的限制,以这种方式获取 logcat 似乎不再可能。我还可以将 PID 和 logcat 直接过滤到文件中,但无法获取程序中的信息。也许这就是它应该工作的方式,并且限制是故意的。烦人的部分是,当我按照上面的方式进行操作并且不过滤 PID 时,我可以获得所有消息。
    • 我想我遇到了一些奇怪的问题。我们目前正在使用定制的 Android 版本,其中有 4 个不同的应用程序在不同的设备上协同工作。我正在做的将需要一种不同的方法,但如果我们将该应用程序设为系统应用程序,您的评论将起作用。
    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 2020-06-30
    • 2012-10-08
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多