使用 Debug Ramdisk 進行 VTS 測試

從 Android 10 開始,用於運行CTS-on-GSI/VTS合規性測試的通用系統映像(GSI) 從 userdebug 更改為用戶構建類型,以便進行發布簽名。這是 VTS 測試的一個問題,因為 VTS 需要adb root才能運行,但adb root在用戶構建設備上不可用。

引入調試 ramdisk(或調試引導映像)以在引導加載程序已解鎖的用戶構建設備上啟用adb root 。這通過對 CTS-on-GSI 和 VTS-on-GSI 使用相同的用戶構建 GSI system.img來簡化測試流程。對於 STS 設置,仍然需要使用另一個 userdebug OEM system.img

下表顯示了 Android 10 中合規性測試的映像和構建類型更改。

測試套件測試建造調試虛擬磁盤亞行根? Android 9 -> 10 構建變體更改
中旅OEM系統用戶ñ ñ不用找了
CTS-on-GSI GSI用戶ñ ñ

用戶調試 -> 用戶 GSI

發布簽名

STS OEM系統用戶調試ñQ中的新功能
VTS GSI用戶

用戶調試 -> 用戶 GSI

發布簽名

概述

這些附加圖像文件在構建文件夾 ( ${ANDROID_PRODUCT_OUT} ) 下生成:

  • boot-debug.img
  • vendor_boot-debug.img

boot-debug.img入設備的boot分區時,系統 sepolicy 文件的 userdebug 版本和附加的屬性文件adb_debug.prop會被加載。這允許adb root使用用戶構建system.img (GSI 或 OEM)。

對於使用具有vendor_boot分區的設備的通用內核映像 (GKI) ,不得刷新boot-debug.img ,因為必須使用經過認證的 GKI 映像來刷新boot分區。相反vendor_boot-debug.img應該被刷入vendor_boot分區,以便於調試 ramdisk。

使用調試 ramdisk 的先決條件

調試 ramdisk 由運行合規性測試的 OEM 提供。它不能是發布簽名的,並且只能在設備解鎖時使用。

調試 ramdisk 不會生成或用於升級設備:

  • BOARD_BUILD_SYSTEM_ROOT_IMAGE
  • 內核命令行中的skip_initramfs

安卓 12 GSI

使用帶有 Android 12 GSI 的調試 ramdisk 不需要額外的說明。

從 09/29/2021 開始,調試 ramdisk 不再需要使用repack_bootimg工具進行更新。在SGR1.210929.001 (7777720)之後構建的 Android 12 GSI 在其system.img中合併了最新的userdebug_plat_sepolicy.cil文件,並忽略了調試 ramdisk 中的userdebug_plat_sepolicy.cil 。有關詳細信息,請參閱CL

安卓 11 GSI

當使用boot-debug.imgvendor_boot-debug.img時,系統 sepolicy 從boot-debug.imgvendor_boot-debug.img的調試 ramdisk 中的userdebug_plat_sepolicy.cil文件加載。為了啟動 GSI 映像,請始終合併來自android11-gsi分支的最新 sepolicy 更改以重建您的boot-debug.imgvendor_boot-debug.img

或者, repack_bootimg工具可用於使用更新的 GSI sepolicy 重建boot-debug.imgvendor_boot-debug.img debug.img。

重新打包調試 ramdisk

合作夥伴可以使用repack_bootimg將 GSI sepolicy 文件更新為boot-debug.img (或vendor_boot-debug.img ,如果設備使用 GKI),而不是合併 sepolicy 更改來重建boot-debug.img

步驟如下:

  1. https://ci.android.com下載otatools.zip 。我們建議從 aosp- aosp-master上的aosp_arm64-userdebug構建工件下載。

  2. 設置repack_bootimg的執行環境:

    unzip otatools.zip -d otatools
    export PATH="${PWD}/otatools/bin:${PATH}"
    repack_bootimg --help
    
  3. 從您正在使用的 GSI 構建中下載userdebug_plat_sepolicy.cilboot-with-debug-ramdisk-${KERNEL_VERSION}.img 。例如,如果您使用RJR1.211020.001 (7840830)中的 arm64 GSI,則從https://ci.android.com/builds/submitted/ 7840830 /aosp_arm64-user/latest下載。

  4. 使用 userdebug_plat_sepolicy.cil 更新設備boot-debug.imgvendor_boot-debug.img userdebug_plat_sepolicy.cil

    repack_bootimg --local --dst_bootimg boot-debug.img \
        --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil
    # If using GKI
    repack_bootimg --local --dst_bootimg vendor_boot-debug.img \
        --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil
    

    使用boot-with-debug-ramdisk-${KERNEL_VERSION}.img

    repack_bootimg --src_bootimg boot-with-debug-ramdisk-5.4.img \
        --dst_bootimg boot-debug.img \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil
    # If using GKI
    repack_bootimg --src_bootimg boot-with-debug-ramdisk-5.4.img \
        --dst_bootimg vendor_boot-debug.img \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil
    

    --ramdisk_add的參數可以根據設備配置進行調整。有關詳細說明,請參閱下一節

userdebug sepolicy 的路徑

上面的repack_bootimg將文件userdebug_plat_sepolicy.cil--dst_bootimg的 ramdisk 複製到--src_bootimg的 ramdisk。但是,調試 ramdisk 中的路徑在不同的 Android 版本中可能會有所不同。在 Android 10 和 11 中,對於內核命令行中androidboot.force_normal_boot=1的設備,路徑為first_stage_ramdisk/userdebug_plat_sepolicy.cil 。否則,路徑為userdebug_plat_sepolicy.cil

運行以下命令檢查內核命令行中是否有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.cil 。下表顯示了不同 Android 版本中調試 ramdisk 中的路徑。

調試圖像安卓 10安卓 11安卓 12
GKI boot-with-debug-ramdisk-${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對列表從不同路徑複製文件或將文件複製到不同路徑。例如,以下命令將文件first_stage_ramdisk/userdebug_plat_sepolicy.cil從 Android 11 boot-with-debug-ramdisk-5.4.img到 Android 11 vendor_boot-debug.img中的first_stage_ramdisk/userdebug_plat_sepolicy.cil userdebug_plat_sepolicy.cil。

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

如果內核命令行中沒有androidboot.force_normal_boot=1 ,則應如下調整命令以將目標路徑更改為userdebug_plat_sepolicy.cil

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

如果傳遞給--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 只能在設備解鎖時使用,這允許在bootvendor_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