关于真实设备中的安卓Logcat

4

我有一些与Android Logcat相关的问题,这些问题是指在真实设备上而不是模拟器上:

  1. 我有一个程序,其中有很多Log.d(或其他类似的日志函数),我进行了一些谷歌搜索并发现这些日志将被输出到一个循环的64K缓冲区。我的问题是,这些64K缓冲区位于哪里?它位于RAM还是文件系统中?应用退出后会被删除吗?

  2. 我谷歌搜索并发现,日志将被输出到一个名为/dev/event的文件中(不确定),但我看不到任何与应用程序相关的日志记录,为什么?只能看到与系统相关的日志条目。

  3. 每个应用程序是否将其日志输出到不同的日志文件中?还是它们都被倾倒到同一个日志文件中?在这种情况下,我们如何分离日志?

  4. 如果日志缓冲区是64K,我们如何增加它?如果我们想将日志重定向到SD卡上的文件中,我们如何限制文件大小(当然也要使其循环)?

1个回答

5

依次来看:

(1) 日志缓冲区在内核中的RAM中。日志由内核驱动程序处理。在最近的设备上,日志缓冲区比64KB大得多。它们不会在应用退出时丢失,但不会在设备重新启动时保留。

(2) 设备条目位于/dev/log中,例如主日志的/dev/log/main,无线电日志的/dev/log/radio和事件日志的/dev/log/events。日志以一种通常比您在logcat中看到的更紧凑的格式存储,因此直接使用类似于cat的工具读取可能会令人困惑。

(3) 所有应用都写入相同的日志设备。每个日志消息都附有日志编写者的进程ID和线程ID的标记,因此您可以通过这种方式将它们分开。(logcat -v threadtime将向您显示pid、tid、时间戳和标记。)

(4) 您需要更改驱动程序中的值才能更改日志的大小。同样,最近的设备具有更大的日志缓冲区,因此这可能不是特别有用。您可以使用logcat将输出发送到文件;如果您想要做某种循环缓冲区,您将需要捕获logcat的输出并自己处理它。(您还可以直接读取日志设备,但我认为API不是公开的。请参阅AOSP logcat源代码。)

最近的Android版本不允许应用程序读取日志中的所有条目。相反,应用程序只能读取它们自己生成的条目。这样做是为了允许漏洞报告系统捕获日志,同时防止错误的应用程序“窥视”其他应用程序。当您从adb shell运行logcat时,它作为shell用户运行,该用户具有读取所有日志的权限。


嗨,“应用程序只能读取它们自己生成的条目”,这是否意味着如果我在我的应用程序中执行类似于"Process process = Runtime.getRuntime().exec("logcat -d");"这样的操作,我只会保留我的应用程序生成的日志?因此,我不需要创建像这样的logcat过滤器http://stackoverflow.com/questions/9729085/programmatically-filtering-logcat-for-my-application-not-working-for-me。 - Sam YC
2
对于Jellybean (API 16)及更高版本,是正确的。对于早期版本,您将看到所有日志,但需要READ_LOGS权限才能访问它们。请参阅https://groups.google.com/forum/?fromgroups=#!topic/android-developers/6U4A5irWang中hackbod的帖子。 - fadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接