使用偵錯 ramdisk 的 VTS 測試

自 Android 10 起,用於執行 CTS-on-GSI/VTS 相容性測試的通用系統映像檔 (GSI) 已從 userdebug 變更為 user 版本類型,以便進行發布簽署。這會導致 VTS 測試出現問題,因為 VTS 需要 adb root 才能執行,但 adb root 無法在使用者建構的裝置上使用。

偵錯 ramdisk (或偵錯開機映像檔) 的目的是在已解鎖系統啟動載入程式的使用者建構裝置上啟用 adb root。這樣一來,您就能使用相同的使用者建構 GSI system.img,為 GSI 上的 CTS 和 GSI 上的 VTS 簡化測試流程。對於 STS 設定,仍須使用其他 userdebug OEM system.img

下表列出 Android 10 中用於法規遵循測試的映像檔和建構類型變更。

測試套件 測試代理程式 建構偵錯 ramdiskADB 根?Android 9 -> 10 建構變化版本變更
CTS 原始設備製造商 (OEM) 的系統 使用者 沒有變化
CTS-on-GSI GSI 使用者

userdebug -> user GSI

已簽署的發布版本

STS 原始設備製造商 (OEM) 的系統 使用者偵錯 Q 的新功能
VTS GSI 使用者

userdebug -> user 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) 就必須使用經過認證的 GKI 映像檔來刷新 boot 分區,因此請勿刷新 boot-debug.img。請改為將 vendor_boot-debug.img 刷新至 vendor_boot 分區,以便偵錯 ramdisk。

使用偵錯 ramdisk 的必要條件

偵錯 ramdisk 是由執行法規遵循測試的原始設備製造商 (OEM) 提供。該應用程式不得簽署發布,且只能在裝置解鎖時使用。

以下裝置不會產生偵錯 RAM 磁碟,也無法用於升級裝置:

  • BOARD_BUILD_SYSTEM_ROOT_IMAGE
  • 核心指令列中的 skip_initramfs

Android 12 GSI

在 Android 12 GSI 中使用偵錯 ramdisk 時不需要額外指示。

自 2021 年 9 月 29 日起,您不再需要使用 repack_bootimg 工具更新偵錯 RAM 磁碟。Android 12 GSI 建構於 SGR1.210929.001 (7777720) 後,將最新的 userdebug_plat_sepolicy.cil 檔案納入其 system.img 中,並忽略偵錯 ramdisk 中的 userdebug_plat_sepolicy.cil。詳情請參閱「CL」。

Android 11 GSI

使用 boot-debug.imgvendor_boot-debug.img 時,系統會從 boot-debug.imgvendor_boot-debug.img 偵錯 RAM 的 userdebug_plat_sepolicy.cil 檔案載入系統機構政策。如要啟動 GSI 映像檔,請務必從 android11-gsi 分支中納入最新的 sepolicy 變更,以便重建 boot-debug.imgvendor_boot-debug.img

或者,repack_bootimg 工具也可以用來根據更新後的 GSI 語意重新建構 boot-debug.imgvendor_boot-debug.img

重新封裝偵錯 ramdisk

合作夥伴可以使用 repack_bootimg 將 GSI 安全政策檔案更新至 boot-debug.img (如果裝置使用 GKI,則為 vendor_boot-debug.img),而非納入安全政策變更來重建 boot-debug.img

相關步驟如下:

  1. https://ci.android.com 下載 otatools.zip。建議您於 aosp-main 上從 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

    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 的引數。如需詳細說明,請參閱下一節

使用者偵錯政策的路徑

上述 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.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 版本中偵錯 RAM 磁碟機內的路徑。

偵錯圖片 Android 10 Android 11 Android 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

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 都會成功,因為只有在裝置解鎖時才能使用偵錯 RAM 磁碟,因此可在 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