在 Android 12 中使用 DebugFS

使用高于 v5.4 的内核版本启动 Android 12 的设备必须随附 GKI 内核。为了让合作伙伴在 userdebug 版本中开发 GKI 内核时可以访问 DebugFS,GKI defconfig 中启用了内核配置 CONFIG_DEBUG_FS。对于在 Android 12 上启动的设备,切勿在用户版本中挂载 DebugFS

Userdebug 版本比用户版本具有更好的测试覆盖率,并在整个开发周期中经过大量测试。以下计划最大限度地减少了两种构建类型在 DebugFS 访问方面的差异,并提供了以下优势

  • 防止 userdebug 版本意外依赖 DebugFS 来实现新功能
  • 确保在开发周期的早期就已知晓任何因缺少 DebugFS 而损坏的现有功能

userdebug 版本中的 Debugfs 访问权限按如下方式分类

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

下表描述了 Android 12 中如何支持这三个类别。请注意,以下内容仅适用于 userdebug 版本,因为 DebugFS 无法在用户版本中挂载。

用例 Android 12 userdebug 版本
一次性 DebugFS 文件初始化,在启动期间。此访问仅在启动时发生一次 Dumpstate HAL 在 HAL 初始化期间执行此操作。为了启用相同的操作,init 在 HAL 初始化之前在 userdebug 版本中挂载 DebugFS。当设备完成启动时,Init 会在 DebugFS 上调用 umount()
Bugreport 生成:dumpstate HAL 读取 DebugFS 文件,这些文件成为错误报告的一部分。 由 dumpstate HAL 在 dumpstate 调用 DumpstateBoard() 时在其中完成 (DumpstateDevice.cpp)。dumpstate 工具(Android 框架的一部分)确保在调用期间挂载 DebugFS
设备特定的测试和验证 Adb root 和 shell。使用 root 权限1 从 adb shell 挂载 DebugFS

1要从 adb shell 挂载 DebugFS 并获得 root 访问权限,请使用以下命令

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

合作伙伴必须采取的操作

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

  • 使 DebugFS 节点的全部启动时间初始化在 dumpstate HAL 初始化期间发生。有关如何执行此操作的示例,请参阅 DNM:DebugFS 文件启动时间初始化示例
  • 不允许在运行时访问 DebugFS。以下例外情况适用
    • 错误报告生成(来自 dumpstate HAL)
    • 测试和验证(可通过 adb rootshell 访问 - 确保首先挂载 DebugFS)

开发者可以设置 debug 持久属性 persist.dbg.keep_debugfs_mounted,以在 userdebug 和 eng 版本中重启后保持 DebugFs 处于挂载状态。

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