디버그 램디스크를 사용한 VTS 테스트

Android 10부터 CSI-on-GSI/VTS 규정 준수 테스트를 실행하는 데 사용되는 일반 시스템 이미지(GSI)를 출시 서명된 버전으로 만들기 위해 GSI가 userdebug에서 사용자 빌드 유형으로 변경되었습니다. 이는 VTS 테스트의 문제입니다. VTS에서는 adb root를 실행해야 하지만 사용자 빌드 기기에서 adb root를 사용할 수 없기 때문입니다.

부트로더가 잠금 해제된 사용자 빌드 기기에서 adb root를 사용할 수 있도록 디버그 램디스크(또는 디버그 부팅 이미지)가 도입되었습니다. 이를 통해 CTS-on-GSI 및 VTS-on-GSI에 동일한 사용자 빌드 GSI system.img를 사용할 수 있어 테스트 플로우가 간소화됩니다. STS 설정에서는 여전히 또 다른 userdebug OEM system.img를 사용해야 합니다.

다음 표에 Android 10에서의 규정 준수 테스트를 위한 이미지와 빌드 유형 변경사항이 나와 있습니다.

테스트 모음 테스트에 사용할 항목빌드디버그 램디스크adb 루트 여부Android 9 -> 10 빌드 변형 변경
CTS OEM 시스템 user 아니요 아니요 변경사항 없음
CTS-on-GSI GSI user 아니요 아니요

userdebug -> user GSI

출시 서명됨

STS OEM 시스템 userdebug 아니요 Q의 새로운 기능
VTS GSI user

userdebug -> user GSI

출시 서명됨

개요

빌드 폴더(${ANDROID_PRODUCT_OUT}) 아래에 다음과 같은 추가 이미지 파일이 생성됩니다.

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

기기의 boot 파티션에 boot-debug.img가 플래시되면 시스템 sepolicy 파일의 userdebug 버전과 추가 속성 파일 adb_debug.prop이 로드됩니다. 이렇게 하면 사용자 빌드 system.img(GSI 또는 OEM)를 통해 adb root가 가능합니다.

vendor_boot 파티션이 있는 기기를 사용하는 일반 커널 이미지(GKI)의 경우 boot-debug.img를 플래시해서는 안 됩니다. boot 파티션은 인증된 GKI 이미지로 플래시해야 하기 때문입니다. 디버그 램디스크를 용이하게 하려면 대신 vendor_boot-debug.imgvendor_boot 파티션에 플래시해야 합니다.

디버그 램디스크 사용을 위한 필수 요건

디버그 램디스크는 규정 준수 테스트를 실행하는 OEM에서 제공합니다. 디버그 램디스크는 출시 서명된 버전이어서는 안 되며, 기기가 잠금 해제된 경우에만 사용할 수 있습니다.

다음과 같은 방법으로 기기를 업그레이드할 때에는 디버그 램디스크가 생성되거나 사용되지 않습니다.

  • BOARD_BUILD_SYSTEM_ROOT_IMAGE true
  • 커널 명령줄의 skip_initramfs

Android 12 GSI

Android 12 GSI에서 디버그 램디스크를 사용하기 위한 추가 안내는 필요하지 않습니다.

2021년 9월 29일부터는 더 이상 repack_bootimg 도구로 디버그 램디스크를 업데이트할 필요가 없습니다. SGR1.210929.001 (7777720) 이후 Android 12 GSI 빌드는 system.img에 최신 userdebug_plat_sepolicy.cil 파일을 통합하고 디버그 램디스크의 userdebug_plat_sepolicy.cil을 무시합니다. 자세한 내용은 CL을 참고하세요.

Android 11 GSI

boot-debug.img 또는 vendor_boot-debug.img가 사용되는 경우 boot-debug.img 또는 vendor_boot-debug.img의 디버그 램디스크에 있는 userdebug_plat_sepolicy.cil 파일에서 시스템 sepolicy가 로드됩니다. GSI 이미지를 부팅하려면 항상 android11-gsi 브랜치의 최신 sepolicy 변경사항을 통합하여 boot-debug.img 또는 vendor_boot-debug.img를 다시 빌드하세요.

또는 업데이트된 GSI sepolicy에 repack_bootimg 도구를 사용하여 boot-debug.img 또는 vendor_boot-debug.img를 다시 빌드할 수 있습니다.

디버그 램디스크 재구성

sepolicy 변경사항을 통합하여 boot-debug.img를 다시 빌드하는 대신 파트너는 repack_bootimg를 사용하여 GSI sepolicy 파일을 boot-debug.img(또는 기기에서 GKI를 사용하는 경우 vendor_boot-debug.img)로 업데이트할 수 있습니다.

단계는 다음과 같습니다.

  1. https://ci.android.com에서 otatools.zip을 다운로드합니다. aosp-mainaosp_arm64-userdebug 빌드 아티팩트에서 다운로드하는 것이 좋습니다.

  2. repack_bootimg의 실행 환경을 설정합니다.

    unzip otatools.zip -d otatools
    export PATH="${PWD}/otatools/bin:${PATH}"
    repack_bootimg --help
    
  3. 사용 중인 GSI 빌드에서 userdebug_plat_sepolicy.cil 또는 boot-with-debug-ramdisk-${KERNEL_VERSION}.img를 다운로드합니다. 예를 들어 RJR1.211020.001 (7840830)에서 arm64 GSI를 사용 중인 경우 https://ci.android.com/builds/submitted/7840830/aosp_arm64-user/latest에서 다운로드합니다.

  4. 기기 boot-debug.img 또는 vendor_boot-debug.imguserdebug_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--src_bootimg 램디스크의 userdebug_plat_sepolicy.cil 파일을 --dst_bootimg 램디스크에 복사합니다. 그러나 디버그 램디스크 내 경로는 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 존재 여부와 관계없이 항상 userdebug_plat_sepolicy.cil입니다. 다음 표는 다양한 Android 버전의 디버그 램디스크 내 경로를 보여줍니다.

디버그 이미지 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 쌍 목록이 포함된 다양한 경로에서 또는 다양한 경로로 파일을 복사할 수 있습니다. 예를 들어 다음 명령어는 Android 11 boot-with-debug-ramdisk-5.4.imgfirst_stage_ramdisk/userdebug_plat_sepolicy.cil 파일을 Android 11 vendor_boot-debug.imgfirst_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 바닥글이 있는 경우 AVB 바닥글은 repack_bootimg 명령어를 실행한 후에 추가해야 합니다. 디버그 램디스크는 기기가 잠금 해제된 상태에서만 사용할 수 있으므로 모든 테스트 키를 사용하여 vendor_boot-debug.img에 서명할 수 있습니다. 이는 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