我知道可以通过使用ADB
提取kmsg
或dmesg
的内容来获得启动日志。
但是,由于Android中没有/var
文件夹(大多数桌面Linux发行版通常存储它们的关机日志的位置),所以我不知道如何检索Android中的关机日志。
那么我该如何在Android中获取关机日志呢?
我知道可以通过使用ADB
提取kmsg
或dmesg
的内容来获得启动日志。
但是,由于Android中没有/var
文件夹(大多数桌面Linux发行版通常存储它们的关机日志的位置),所以我不知道如何检索Android中的关机日志。
那么我该如何在Android中获取关机日志呢?
可以在以下位置中查找:
/proc/last_kmsg
/data/tombstones/
/data/dontpanic/
/data/system/dropbox/
(此列表不仅限于内核日志,还包括框架和应用程序日志,这些日志有时也很有用)
TL;DR:
通过adb运行命令,将logcat和proc/kmsg复制到文件中,并使用nohup
、disown
或setsid
保持运行,即使adb断开连接。可能需要busybox,也需要root和adb root。
setsid cat proc/kmsg > /sdcard/kmsg.txt &
和
logcat -v long -f /sdcard/logcat.txt
(不知何故,只有在没有setsid
的情况下才能正常工作)
或者将普通复制命令添加到一些启动脚本中。
/TL;DR
您可以不断地将proc/kmsg
和logcat
复制到Android设备或microSD卡上的文件中,以获取日志,即使adb断开连接。
adb shell
获取Android shell之后,输入su
以获取超级用户访问权限。&
),还需要确保命令在adb断开连接后继续运行。这可以通过nohup
、disown
或setsid
来实现(有关用法,请参见此处)。setsid cat proc/kmsg > /sdcard/kmsg.txt &
用于内核消息。logcat -v long -f /sdcard/logcat.txt
或 logcat -v long > /sdcard/logcat.txt
我不知道为什么,但有时它不适用于setsid
,执行命令后就不会连续复制,而是在短时间内停止。在这些情况下,也会显示jobs
,否则不会。然后,它就可以在没有setsid
的情况下工作,在断开和重新连接后仍然保持活动状态。我想如果文件确实不断变大,你必须尝试一下。如果有人弄清楚了它的行为方式......让我知道,我会编辑答案。新款手机不再使用这些位置,所以如果你正在阅读本文,那么从现在开始
内核崩溃日志现在位于/sys/fs/pstore而不是/proc/last_kmsg中。
我发现在Android中收集关机日志的一个方法是在主机PC上运行adb pull /proc/kmsg C:\Logs.txt
,然后关闭设备。您将获得日志,直到主机和设备之间的USB通信被断开!我知道这只是众多关机情况中的一种,但对其他情况我没有找到令人满意的答案!
adb shell getprop | grep -A3 boot.reason
[persist.sys.boot.reason]: []
[persist.sys.boot.reason.history]: [watchdog,1692290965
reboot,userrequested,1692249163
watchdog,1691516754
watchdog,1691078769]
--
[sys.boot.reason]: [watchdog]
[sys.boot.reason.last]: [watchdog]
[sys.boot_completed]: [1]
[sys.bootstat.first_boot_completed]: [1]
[sys.fuse.transcode_enabled]: [true]
我也曾经在寻找同样的答案,最终我找到了!
在 Android 8 中,所有的日志都位于 \data\log\android_logs\...
,包括应用程序和内核日志。内核日志被称为 kmsgcat-log_timestamp_.gz
编辑:虽然这是一个非常古老的帖子,但我认为这个答案可能会有所帮助。