Google 致力于为黑人社区推动种族平等。查看具体举措

使用调试 Ramdisk 进行 VTS 测试

在 Android 10 中,用于运行 CTS-on-GSI/VTS 合规性测试的通用系统映像 (GSI) 从 userdebug build 类型改成了 user build 类型,这是因为 GSI 已进行版本签名。但是,用户 build 中未提供 adb root 命令,该命令可向受测 Android 设备授予主机 root 权限。这会带来问题,因为 VTS 需要 adb root 才能运行。

Android 10 中引入了调试 ramdisk,以便在设备处于解锁状态时启动 adb root。这样就可以重复使用相同的用户 build GSI system.img,从而简化测试流程。对于 STS 设置,仍需使用另一个 userdebug OEM system.img。下表显示了 Android 10 中合规性测试的映像和 build 类型。

测试套件 测试所用的版本版本类型调试 ramdisk是否运行 adb root? Android 9 -> 10 构建变体变化
CTS OEM 的系统 用户 没有变化
CTS-on-GSI GSI 用户

userdebug -> 用户 GSI

已进行版本签名

STS OEM 的系统 userdebug Q 中新增
VTS GSI 用户

userdebug -> 用户 GSI

已进行版本签名

供应商启动调试 ramdisk

从 Android 11 开始,对于支持通用内核映像 (GKI) 架构的设备,应将 vendor_boot-debug.img 刷写到 VTS 中的 /vendor_boot 分区。此外,还应将已签名的 GKI boot-${KERNEL_VERSION}.img(而非 boot-debug-{KERNEL_VERSION}.img)刷写到 /boot 分区。

使用调试 ramdisk 的先决条件

调试 ramdisk 由运行合规性测试的 OEM 提供。它不应进行版本签名,并且只能在设备处于解锁状态时使用。

在以下情况下,系统不会为升级设备而生成或使用调试 ramdisk:

  • BOARD_BUILD_SYSTEM_ROOT_IMAGE true
  • 内核命令行中存在 skip_initramfs

当您使用 boot-debug.img 时,系统将从 boot-debug.img 加载系统 sepolicy (plat_sepolicy.cil)。请始终采用来自 android{N}-gsi 分支(例如 android11-gsi)的新 sepolicy 变更来重新构建 boot-debug.img。否则,设备可能无法启动新的 GSI 映像。这一条同样适用于对具有 /vendor_boot 分区的设备使用 vendor_boot-debug.img 的情况。

重新打包调试 ramdisk

合作伙伴可以使用 repack_bootimg 将 sepolicy 文件更新为 boot-debug.img(在设备使用通用 boot.img 的情况下更新为 vendor_boot-debug.img),而无需采用 sepolicy 变更来重新构建 boot-debug.img

相关步骤如下:

  1. https://ci.android.com 下载 otatools.zip。例如,从 aosp_arm64-userdebug 构建工件中下载。

  2. 运行以下命令来检查 repack_bootimg 是否可用。

    $ unzip otatools.zip -d otatools
    $ export PATH="$PWD"/otatools/bin:"$PATH"
    $ repack_bootimg
    
  3. 从 GSI build 下载通用 boot-debug.img。例如,如果您使用的是 RJR1.210330.001_7244771 中的通用 system.img,那么请从同一版本 RJR1.210330.001_7244771 中下载通用 boot-debug-${KERNEL_VERSION}.img

  4. 运行以下命令以从 boot-debug-${KERNEL_VERSION}.img 提取 userdebug sepolicy 文件,并将其更新为设备专用的 boot-debug.img(或 vendor_boot-debug.img)。

    $ repack_bootimg --src_bootimg boot-debug-5.4.img --dst_bootimg boot-debug.img
    $ repack_bootimg --src_bootimg boot-debug-5.4.img --dst_bootimg vendor_boot-debug.img
    

userdebug sepolicy 的路径

上述 repack_bootimg 文件会将文件 /userdebug_plat_sepolicy.cil--src_bootimg 的 ramdisk 复制到 --dst_bootimg 的 ramdisk。但是,调试 ramdisk 中的路径可能因 Android 版本的不同而异。在 Android 10 和 11 中,若内核命令行中存在 androidboot.force_normal_boot=1,设备的路径为 /first_stage_ramdisk/userdebug_plat_sepolicy.cil。否则,路径为 /userdebug_plat_sepolicy

运行以下命令以检查内核命令行中是否存在 androidboot.force_normal_boot

$ adb root
$ adb shell cat /proc/cmdline | grep force_normal_boot

从 Android 12 开始,无论内核命令行中是否存在 androidboot.force_normal_boot=1,调试 ramdisk 中的路径始终为 /userdebug_plat_sepolicy。下表显示了不同 Android 版本中调试 ramdisk 中的路径。

调试映像 Android 10 Android 11 Android 12
GKI boot-debug-{KERNEL_VERSION}.img 不适用 /first_stage_ramdisk/userdebug_plat_sepolicy.cil /userdebug_plat_sepolicy.cil
设备专用的 boot-debug.img 取决于 force_normal_boot 取决于 force_normal_boot /userdebug_plat_sepolicy.cil
设备专用的 vendor_boot-debug.img 不适用 取决于 force_normal_boot /userdebug_plat_sepolicy.cil

您可以通过指定 --ramdisk_add 来复制文件,借助 src_path:dst_path 对列表,可以为文件复制指定不同的源和目标位置。例如,以下命令会将 Android 12 boot-debug-5.4.img 中的文件 /userdebug_plat_sepolicy 复制到 Android 11 vendor_boot-debug.img 内的 /first_stage_ramdisk/userdebug_plat_sepolicy.cil 中。

$ repack_bootimg \
    --src_bootimg boot-debug-5.4.img \
    --dst_bootimg vendor_boot-debug.img \
    --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil

如果内核命令行中没有 androidboot.force_normal_boot=1,应按如下方式调整命令,以将目的地路径更改为 /userdebug_plat_sepolicy

$ repack_bootimg \
    --src_bootimg boot-debug-5.4.img \
    --dst_bootimg vendor_boot-debug.img \
    --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil

--help 选项也给出了更多示例。

$ repack_bootimg --help

如果传递给 --dst_bootimg 的映像被配置为 AVB 链式分区,则需要在运行 repack_bootimg 命令后添加 AVB 页脚。

例如,在运行 repack_bootimg 之前,请运行以下命令来检查 vendor_boot-debug.img 是否具有链式 AVB 页脚。

$ avbtool info_image --image vendor_boot-debug.img

如果它最初具有链式 AVB 页脚,则需要在运行 repack_bootimg 命令之后添加 AVB 页脚。可以使用任何测试密钥为 vendor_boot-debug.img 签名,因为只有在设备解锁后才可以使用调试 ramdisk,这样便可以在 /boot/vendor_boot 分区中使用通过非发布密钥签名的映像。

$ avbtool add_hash_footer --partition_name vendor_boot \
    --partition_size 100663296 \
    --algorithm SHA256_RSA4096 \
    --key otatools/external/avb/test/data/testkey_rsa4096.pem \
    --image vendor_boot-debug.img

AOSP 的变化

AOSP 中的调试 ramdisk 变更以 debug_ramdisk # 标签标识。

这些附加的映像文件是在 build 文件夹 out/target/product/$(TARGET_DEVICE) 下生成的:

  • ramdisk-debug.img
  • boot-debug.img

boot-debug.img 刷写到设备的 /boot 分区上时,系统会加载 userdebug 版本的系统 sepolicy 文件和一个附加的属性文件 adb_debug.prop。这样就可以在 user build system.img(GSI 或 OEM 的系统映像)中运行 adb root

这也适用于将 vendor_boot-debug.img 刷写到 vendor_boot 分区的设备。也就是说,调试文件可以从 /boot 分区或 /vendor_boot 分区加载。