如何以编程方式实时读取 logcat?

How to programmatically read logcat in real time?

我有一个服务想从 logcat 读取数据,从服务开始(即在服务开始之前丢弃 logcat 数据),监控 logcat实时数据,过滤 logcat 以仅显示 "ActivityManager" 的标签和信息日志。

然后我想根据过滤后的 logcat 数据执行某些操作。我尝试了以下方法,但它不起作用:

Runtime.getRuntime().exec("logcat -c"); // flush the logcat first
Process process = Runtime.getRuntime().exec("logcat ActivityManager:I"); // filters logcat to only "ActivityManager:I" logs
BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(process.getInputStream()));

StringBuilder log = new StringBuilder();
String line = "";
Log.d(TAG,  "Reading filtered logcat");
while ((line = bufferedReader.readLine()) != null) {
    log.append(line);
}

有谁知道我错在哪里?

我建议您查看此 SO post 中发布的问题和答案。我不在安装了工作室的机器上,所以我现在无法尝试。为了帮助我们回答您的问题,您能否提供更多有关您遇到的问题的信息?当您说您拥有 "doesn't work" 的方法时,您是什么意思? 'log' 的值不会改变吗?是否抛出异常?是否提供了日志但未过滤?

此外,您尝试执行的操作可能无法在无根设备上运行。正如 this SO post/answer 解释的那样,您无法再访问其他应用程序的日志,只能访问您自己的应用程序的日志。这意味着您的服务只能读取它所属的应用程序在无根设备上的日志。

好的,原来我错过了 logcat 中的 -s 参数,它过滤了 logcat 输出。