Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

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

Android 10에서는 일반 시스템 이미지(GSI)는 서명된 버전이므로 CSI-on-GSI/VTS 준수 테스트를 실행하는 데 사용되는 GSI는 userdebug에서 사용자 빌드 유형으로 변경되었습니다. 그러나, 테스트 중인 Android 기기에 호스트 루트 권한을 부여하는 adb root 명령어는 사용자 빌드에서 사용할 수 없습니다. VTS를 실행하려면 adb root가 필요하기 때문에 발생하는 문제입니다.

기기가 잠금 해제된 경우에 adb root를 가능하게 하기 위해 Android 10에 디버그 램디스크가 도입되었습니다. 이렇게 하면 동일한 사용자 빌드 GSI system.img를 재사용하여 테스트 플로우를 간소화할 수 있습니다. STS 설정에서는 여전히 또 다른 userdebug OEM system.img를 사용해야 합니다. 다음 표에는 Android 10에서의 규정 준수 테스트와 관련된 이미지와 빌드 유형이 나와 있습니다.

테스트 제품군 테스트에 사용할 항목빌드디버그 ramdiskadb 루트 여부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 11부터는 일반 커널 이미지(GKI) 아키텍처를 지원하는 기기의 경우 vendor_boot-debug.img를 VTS의 /vendor_boot 파티션에 플래시해야 합니다. 서명된 GKI boot-${KERNEL_VERSION}.imgboot-debug-{KERNEL_VERSION}.img 대신 /boot 파티션에 플래시되어야 합니다.

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

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

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

  • BOARD_BUILD_SYSTEM_ROOT_IMAGE true
  • 커널 명령줄의 skip_initramfs

boot-debug.img를 사용하면 시스템 sepolicy(plat_sepolicy.cil)가 boot-debug.img에서 로드됩니다. 항상 android{N}-gsi 분기의 새 sepolicy 변경사항을 통합하여 boot-debug.img를 다시 빌드하세요(예: android11-gsi). 그렇지 않으면 기기에서 새 GSI 이미지를 부팅하지 못할 수 있습니다. 이는 /vendor_boot 파티션이 있는 기기의 경우 vendor_boot-debug.img에도 적용됩니다.

디버그 램디스크 재구성

sepolicy 변경사항을 통합하여 boot-debug.img를 다시 빌드하는 대신 파트너는 repack_bootimg를 사용하여 sepolicy 파일을 boot-debug.img(또는 기기에서 일반 boot.img를 사용하면 vendor_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 빌드에서 일반 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--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입니다.

다음 명령어를 실행하여 커널 명령줄에 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입니다. 다음 표는 다양한 Android 버전의 디버그 램디스크 내 경로를 보여줍니다.

디버그 이미지 Android 10 Android 11 Android 12
GKI boot-debug-{KERNEL_VERSION}.img N/A /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 N/A force_normal_boot에 따라 다름 /userdebug_plat_sepolicy.cil

--ramdisk_add를 지정하여 다양한 위치에서 또는 다양한 위치로 src_path:dst_path 쌍 목록이 포함된 파일을 복사할 수 있습니다. 예를 들어 다음 명령어는 /userdebug_plat_sepolicy 파일을 Android 12 boot-debug-5.4.img에서 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 바닥글이 있는 경우 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

AOSP 변경사항

AOSP의 디버그 램디스크 변경사항은 debug_ramdisk 해시태그를 통해 식별됩니다.

빌드 폴더 out/target/product/$(TARGET_DEVICE) 아래에 다음과 같은 추가 이미지 파일이 생성됩니다.

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

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

이는 vendor_boot-debug.imgvendor_boot 파티션에 플래시된 기기에도 적용됩니다. 즉, 디버그 파일을 /boot 또는 /vendor_boot 파티션에서 로드할 수 있습니다.