【问题标题】:How are logcat messages savedlogcat 消息是如何保存的
【发布时间】:2013-05-28 07:50:47
【问题描述】:

Where are Android logcat files stored? 之后,我了解到 logcat 被保存为内核中的内部环形缓冲区,大小为 256kb。应用程序使用特殊的 API 要求内核保存日志。

我的设备日志要大得多。我知道这一点,因为当我adb logcat > adblogcat.txt 时,我得到一个非常大的文件。这意味着“某事”会清除内核缓冲区并将它们存储在文件系统 (?) 中,adb logcat 会从这个更大的文件中读取。

谁能解释一下这是如何工作的?我正在调查https://github.com/cgjones/android-system-core/blob/master/logcat/logcat.cpp,但我无法理解具体细节。

奖励点指向解释重启时会发生什么的人,是否在重启之间保存日志?

【问题讨论】:

    标签: android logcat android-logcat


    【解决方案1】:

    以下是我对logcat的理解,可能有一些错误,欢迎各位cmets:

    1. 关于手机中的日志文件: 来自frameworks/base/core/jni/android_util_Log.cpp 我们可以看到默认情况下所有日志都将写入您设备中的/dev/log/ 文件夹。 main 将被写入/dev/log/main 收音机将被写入/dev/log/radio ... 因为都是操作系统的I/O文件。所以当手机重启时会有清除。而且这些文件的大小有一定的限制,如果达到限制,旧的日志会被覆盖。

    2. 关于 Logcat: Logcat 是一个读取或重新输出日志文件的工具。它安装在手机的 system/bin/ 文件夹中。 logcat.cpp的所有代码我都没有看;但我可以说,logcat 应用程序默认会读取 system/logcat/main 中的日志文件,并根据您使用的参数将它们输出到屏幕或文件中。

    3. 关于日志的生成方式: 如果你看到android.util.log的源码,你会发现所有的log.d/log.e都会使用JNI的方式将日志写入日志文件,如上所述。

      public static native int println_native(int bufID,int priority, String tag, String msg);

      你可以找到JNI方法here。如果您对它感兴趣,您可以阅读源代码以了解它在其中的作用。

    4. 将 logcat 保存到您想要的特定文件: 基于Log I/O,开发者可以编写一个应用程序将日志保存到手机SD卡中的一个文件中,这样我们就可以保存更多的日志或者更大的日志文件。 最简单的方法是使用Runtime.exec() 来执行logcat 应用程序: 您可以监控 BOOT 完成的接收器来启动您的 logcat 命令,将所有 logcat 的日志读取到您自己的文件中。

    例如:

     String cmd = "logcat -v time -f yourown.file"
     Process process = Runtime.getRuntime().exec(cmd);
    

    【讨论】:

    • 关于 4,我会在 init.rc 中执行此操作,作为启动时启动的脚本。
    • 是的,我想它可以工作。像这样:service goldfish-logcat /system/bin/logcat >> yourfileonsdcard oneshot 这是一个模拟器脚本。
    • @buptcoder 感谢您的精彩概述。我一直在 Android 文档中寻找这个,但找不到!
    • @buptcoder..我无法在我的手机三星 Galaxy s5 中看到 /dev/log/ :(你能告诉我如何/在哪里可以找到这个吗?
    • 你好vinu,如果你的手机没有root,你应该没有权限评估dev文件夹。
    猜你喜欢
    • 2015-07-22
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多