有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用进程和PID过滤正确捕获logcat?

这似乎很简单

我正在使用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();

共 (1) 个答案

  1. # 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);
                }
            }