在 Android 12 中使用 DebugFS

发布时搭载 Android 12 且内核版本高于 v5.4 的设备必须附带 GKI 内核。这样,合作伙伴在 GKI 内核上进行开发时,就可以在 userdebug build 中访问 DebugFS。GKI defconfig 中启用了内核配置 CONFIG_DEBUG_FS。对于发布时搭载 Android 12 的设备,切勿在 user build 中装载 DebugFS

相较于 user build,userdebug build 的测试覆盖率更高,并且在整个开发周期内会经过大量测试。以下方案最大限度地减少了这两种 build 类型在 DebugFS 访问方面的差异,并提供以下优势:

  • 防止 userdebug build 意外依赖于 DebugFS 来实现新功能
  • 确保在开发周期的早期阶段发现因缺少 DebugFS 而被破坏的任何现有功能

userdebug build 中的 DebugFS 访问分为以下几类:

  1. 设备启动期间的 DebugFS 文件初始化,例如,对 DebugFS 中的文件进行写入,以开启调试数据收集。
  2. 生成 bug 报告:当 dumpstate 调用 DumpstateBoard() 时,dumpstate HAL 会读取 DebugFS 文件。此信息将成为 bug 报告的一部分。
  3. 设备专用测试和验证。

下表介绍了 Android 12 中如何支持这三类访问。请注意,以下内容仅适用于 userdebug build,因为 DebugFS 无法装载到 user build 中。

用例 Android 12 userdebug build
启动过程中的一次性 DebugFS 文件初始化。该访问仅在启动过程中发生一次 dumpstate HAL 会在 HAL 初始化过程中执行此操作。为了支持相同功能,init 会在 HAL 初始化之前在 userdebug build 中装载 DebugFSInit 会在设备完成启动后对 DebugFS 调用 umount()
生成 bug 报告:dumpstate HAL 会读取 DebugFS 文件,这些文件将成为 bug 报告的一部分。 当 dumpstate (DumpstateDevice.cpp) 调用 DumpstateBoard() 时,由 dumpstate HAL 在 DumpstateBoard() 内完成。dumpstate 工具(Android 框架的一部分)可确保 DebugFS 在调用期间装载。
设备专用测试和验证 adb root 和 shell。使用 root 权限1从 adb shell 装载 DebugFS

1如需使用 root 权限从 adb shell 装载 DebugFS,请使用以下命令:

adb shell mount -t debugfs debugfs /sys/kernel/debug

需要合作伙伴执行的操作

合作伙伴必须根据 Android 12 设备中的这些变化执行以下操作:

  • 确保 DebugFS 节点的所有启动时初始化均在 dumpstate HAL 初始化过程中执行。如需查看有关如何执行此操作的示例,请参阅 DNM:DebugFS 文件的启动时初始化示例
  • 在运行时不允许访问 DebugFS。但以下情况除外:
    • 生成 bug 报告(由 dumpstate HAL 访问)
    • 测试和验证(可通过 adb rootshell 访问 - 请确保先装载 DebugFS)

开发者可以设置调试持久属性 persist.dbg.keep_debugfs_mounted,使 DebugFs 在 userdebug build 和 eng build 重新启动后保持装载状态。

GTS 合规性测试可确保不会在 user build 中装载 DebugFS 文件系统。Sepolicy neverallow 语句可确保在发布时搭载 Android 12 或更高版本的设备上,未经授权的进程无法访问 DebugFs