发布时搭载 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 访问分为以下几类:
- 设备启动期间的
DebugFS
文件初始化,例如,对DebugFS
中的文件进行写入,以开启调试数据收集。 - 生成 bug 报告:当
dumpstate
调用DumpstateBoard()
时,dumpstate HAL 会读取DebugFS
文件。此信息将成为 bug 报告的一部分。 - 设备专用测试和验证。
下表介绍了 Android 12 中如何支持这三类访问。请注意,以下内容仅适用于 userdebug build,因为 DebugFS
无法装载到 user build 中。
用例 | Android 12 userdebug build |
---|---|
启动过程中的一次性 DebugFS 文件初始化。该访问仅在启动过程中发生一次。 |
dumpstate HAL 会在 HAL 初始化过程中执行此操作。为了支持相同功能,init 会在 HAL 初始化之前在 userdebug build 中装载 DebugFS 。Init 会在设备完成启动后对 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 root
和shell
访问 - 请确保先装载 DebugFS)
开发者可以设置调试持久属性 persist.dbg.keep_debugfs_mounted
,使 DebugFs
在 userdebug build 和 eng build 重新启动后保持装载状态。
GTS 合规性测试可确保不会在 user build 中装载 DebugFS
文件系统。Sepolicy neverallow
语句可确保在发布时搭载 Android 12 或更高版本的设备上,未经授权的进程无法访问 DebugFs
。