将 logcat 输出保存为字符串值

Saving logcat output to a String value

我需要在字符串变量出现 ANR 错误时保存 logcat 输出,并将其显示在我的应用程序内的文本视图中。 我试图通过在按下按钮时调用此函数来做到这一点

        Process process = Runtime.getRuntime().exec("logcat -d | grep \"ANR\" -A 38");
        BufferedReader bufferedReader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));

        StringBuilder log = new StringBuilder();
        String line = "";
        while ((line = bufferedReader.readLine()) != null) {

            log.append(line);
        }

        mTxtAnrinfo.setText(log.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }

}

不过好像不行。更糟糕的是调试没有提供有用的信息。 我还设置了所需的清单文件权限

<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

我错过了什么?只是执行命令 logcat-d | grep "ANR" -A 38 在 shell 中提供所需的 logcat 数据,但是当我从应用程序中 运行 它时,我什么也得不到。 while 循环中的行为空。

谢谢!

更新: 该应用程序安装为系统应用程序,要读取的日志来自其他遇到ANR错误的应用程序。

我找到了可行的解决方案。

从 Android 4.1+ 开始,应用无法再从其他应用访问日志。

shell 用户能够从其他应用程序获取日志,所以像

这样简单的事情
String[] cmd = {
            "/system/bin/sh",
            "-c",
            "logcat -d | grep \"ActivityManager: ANR\" -A 38"
        };

        Process process = Runtime.getRuntime().exec(cmd);

可以给我们其他应用程序的日志。 即使应用程序本身无法从其他应用程序访问所需的日志,这样做也会以具有所需权限的 shell 用户身份触发命令。 保存为字符串,根据需要解析即可。 干杯!