package com.tencent.wstt.gt.log.logcat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class LogcatHelper { public static final String BUFFER_MAIN = "main"; public static final String BUFFER_EVENTS = "events"; public static final String BUFFER_RADIO = "radio"; public static Process getLogcatProcess(String buffer) throws IOException { List<String> args = getLogcatArgs(buffer); Process process = RuntimeHelper.exec(args); return process; } private static List<String> getLogcatArgs(String buffer) { List<String> args = new ArrayList<String>(Arrays.asList("logcat", "-v", "time")); // for some reason, adding -b main excludes log output from // AndroidRuntime runtime exceptions, // whereas just leaving it blank keeps them in. So do not specify the // buffer if it is "main" if (!buffer.equals(BUFFER_MAIN)) { args.add("-b"); args.add(buffer); } return args; } public static String getLastLogLine(String buffer) { Process dumpLogcatProcess = null; BufferedReader reader = null; String result = null; try { List<String> args = getLogcatArgs(buffer); args.add("-d"); // -d just dumps the whole thing dumpLogcatProcess = RuntimeHelper.exec(args); reader = new BufferedReader(new InputStreamReader(dumpLogcatProcess.getInputStream()), 8192); String line; while ((line = reader.readLine()) != null) { result = line; } } catch (IOException e) { e.printStackTrace(); } finally { if (dumpLogcatProcess != null) { RuntimeHelper.destroy(dumpLogcatProcess); } // post-jellybean, we just kill the process, so there's no need // to close the bufferedReader. Anyway, it just hangs. if (VersionHelper.getVersionSdkIntCompat() < VersionHelper.VERSION_JELLYBEAN && reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } }