gpt4 book ai didi

android - 在 init.rc 中启用 logcat

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:26 28 4
gpt4 key购买 nike

我在 Android 根目录中附加了 init.rc:

service logcat /system/bin/logcat -v long -f /mnt/sdcard/logcat.log

此解决方案不会生成任何日志。 logcat.log 文件不存在。

如何开始通过 init.rc 收集 logcat 输出?

最佳答案

可能导致上述问题的几件事:1. 您将服务定义为 logcat。这看起来非常接近可能是保留/预先存在的名称。我会选择一个更尊贵的服务名称。2. 服务没有明确的启动触发器,因此它完全取决于定义它的上下文(即哪个初始阶段)。选择错误的阶段(即太早)和/mnt 甚至可能不存在。3. 默认情况下,该服务将以 root 身份运行,因此 logcat.log 文件只能由 root 读取。不适合以 root 身份运行进程。强制读者成为 root 用户以读取日志文件并不好。

这是我用来实现您想要做的事情的方法。

问题:通常,Android 日志消息仅保留在内核的( volatile )内存中,因此不会在重启后继续存在。

解决方案:要在重启后保留这些日志消息,需要将它们写入持久存储(即文件系统)。下面的代码定义了这样一个服务,它在 init 时由 Android 启动。

第 1 步,定义 Android init 进程将派生的服务来执行此 Activity 。这进入 init.rc。

service persistentLogging /system/bin/logcat -r 1024 -n 9 -v threadTime -f /cache/logs/log
user system
group system log
disabled

关于上面的注释:

  1. 它通过启动触发器创建一个名为 persistentLogging 的服务(将在下面的第二步中引用)。
  2. 它请求 logcat 在目录 -/cache/logs(即 log、log.1、log.2、... log.9)中执行滚动日志文件(由 10 个文件/每个 1Mb 组成)。根据您的需要进行调整。
  3. 该服务以系统用户身份运行。这意味着日志文件只能由系统读写。如果您的应用程序具有系统权限,那么您将能够读取日志文件。我还将服务也定义在日志组中,因为这似乎是合适的,尽管由于文件无法按组读取,这是一个有争议的问题。
  4. 该服务最初是禁用的。它将由下面定义的触发器启动
  5. 服务不是一次性的。因此,如果它死了,Android 将尝试重新启动它。

第二步,定义启动服务的触发器。这也会出现在您的 init.rc 文件中。

on post-fs
mkdir /cache/logs 0775 system log
start persistentLogging

关于上面的注释:

  1. 这些命令在“post-fs”阶段触发,因此它们发生在文件系统分区挂载之后以及其他系统目录的权限更改时。理想情况下,此服务应尽可能晚地启动,因为它不重要或不被任何其他启动 Activity 使用。
  2. 触发器在启动服务之前首先创建目标目录。请记住 mkdir 命令语法是由 init.rc 语言定义的。在 Android 中,此语法不是 sh 语法,尽管它看起来很像。
  3. 尽管上述日志服务直到 init 的 post-fs 阶段才启动,但它仍然会转储自内核启动以来的所有日志信息,因为这些日志消息已经在内核缓冲区中,并且此日志服务仅仅是将这些消息复制到文件中。
  4. 虽然上面的两个代码 fragment 最终都需要出现在 init.rc 文件中,但如果将这些添加添加到为设备定义的 init.${ro.hardware}.rc 文件中,则更易于维护。例如init.rc 自动包含的 init.freescale.rc。

关于android - 在 init.rc 中启用 logcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17406209/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com