使用Runtime类执行'adb logcat'命令

时间:2015-05-29 16:23:59

标签: java android cmd logcat

我试图将logcat内容放入JTextPane。我使用下面的代码希望它将内容作为String返回,但它会冻结,并且不会产生错误。

Process exec = null;
    try {
        exec = Runtime.getRuntime().exec("adb logcat -d");
        InputStream errorStream = exec.getErrorStream();
        BufferedReader ebr = new BufferedReader(new InputStreamReader(errorStream));
        String errorLine;
        while ((errorLine = ebr.readLine()) != null) {
            System.out.println("[ERROR] :- " + errorLine);
        }

        if (exec.waitFor() == 0) {
            InputStream infoStream = exec.getInputStream();
            InputStreamReader isr = new InputStreamReader(infoStream);
            BufferedReader ibr = new BufferedReader(isr);
            String infoLine;
            while ((infoLine = ibr.readLine()) != null) {
                System.out.println("[INFO] :- " + infoLine);
            }
        }
    } catch (IOException | InterruptedException ex) {
        ex.printStackTrace();
    } finally {
        if (exec != null) {
            exec.destroy();
        }
    }

我提到了一些教程但是,他们没有解决我的问题。这是错的吗?有没有其他方法可以以编程方式将logcat内容作为String获取?对不起,如果这是一个愚蠢的问题。

1 个答案:

答案 0 :(得分:3)

您所看到的问题是您正在尝试处理命令流并等待执行过程,所有这些都在同一个线程中。它被阻止,因为读取流的过程正在等待进程,并且您正在丢失流输入。

您要做的是在另一个线程中实现读取/处理命令输出(输入流)的函数,并在启动该过程时启动该线程。

其次,您可能希望使用ProcessBuilder而不是Runtime.exec

这样的事情可以适应你想做的事情:

public class Test {
    public static void main(String[] args) throws Exception {            
        String startDir = System.getProperty("user.dir"); // start in current dir (change if needed)
        ProcessBuilder pb = new ProcessBuilder("adb","logcat","-d");
        pb.directory(new File(startDir));  // start directory
        pb.redirectErrorStream(true); // redirect the error stream to stdout
        Process p = pb.start(); // start the process
        // start a new thread to handle the stream input
        new Thread(new ProcessTestRunnable(p)).start();
        p.waitFor();  // wait if needed
    }

    // mimics stream gobbler, but allows user to process the result
    static class ProcessTestRunnable implements Runnable {
        Process p;
        BufferedReader br;

        ProcessTestRunnable(Process p) {
            this.p = p;
        }

        public void run() {
            try {
                InputStreamReader isr = new InputStreamReader(p.getInputStream());

                br = new BufferedReader(isr);

                String line = null;
                while ((line = br.readLine()) != null)
                {
                    // do something with the output here...                        
                }
            }
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}