Android 12에서는 일반 커널 이미지(GKI)라고 하는 일반 boot
이미지에 일반 램디스크와 GKI 커널이 포함되어 있습니다.
Android 13으로 출시되는 기기의 경우 일반 램디스크는 boot
이미지에서 삭제되고 별도의 init_boot
이미지에 배치됩니다. 이에 따라 boot
이미지에 GKI 커널만 남게 됩니다.
Android 12 또는 이전 커널 버전을 계속 사용하는 기기를 업그레이드하는 경우 일반 램디스크는 새 init_boot
이미지 요구사항 없이 원래 위치에 있습니다.
일반 램디스크를 빌드하려면 일반 램디스크에 1단계 init
와 타임스탬프 정보가 포함된 속성 파일만 포함되도록 램디스크에서 공급업체별 리소스를 이동합니다.
다음과 같은 기기의 경우
전용
recovery
파티션을 사용하지 않으면 모든 복구 비트가 일반 램디스크에서vendor_boot
램디스크로 이동합니다.전용
recovery
파티션을 사용하는 기기에서는recovery
램디스크를 변경하지 않아도 됩니다.recovery
램디스크가 독립되어 있기 때문입니다.
아키텍처
다음 다이어그램은 Android 12 이상을 실행하는 기기의 아키텍처를 보여줍니다.
Android 13으로 출시되는 기기에는 일반 램디스크가 포함된 새로운 init_boot
이미지가 있습니다.
Android 12에서 Android 13으로 업그레이드하는 기기는 Android 12와 동일한 아키텍처를 사용합니다.
Android 13으로 출시, 전용 복구 없음
그림 1. Android 13으로 출시되거나 Android 13으로 업그레이드되는 기기(GKI 포함, 전용 복구 없음)
Android 13으로 출시, 전용 및 A/B 복구(전용 램디스크)
그림 2. Android 13으로 출시되거나 Android 13으로 업그레이드되는 기기(GKI, 전용 및 A/B 복구 포함)
기기에 recovery_a
및 recovery_b
파티션이 있으면 이 그림을 참고하세요.
Android 13으로 출시, 전용 및 비 A/B 복구(전용 램디스크)
그림 3. Android 13으로 출시되거나 Android 13으로 업그레이드되는 기기(GKI, 전용 및 비 A/B 복구 포함)
기기에 슬롯 접미사가 없는 recovery
라는 파티션이 있으면 이 그림을 참고하세요.
Android 12로 출시 또는 업그레이드, 전용 복구 없음
그림 4. Android 12로 출시하거나 업그레이드하는 기기(GKI 포함, 전용 복구 없음)
Android 12로 출시 또는 업그레이드, 전용 및 A/B 복구(전용 램디스크)
그림 5. Android 12로 출시하거나 업그레이드하는 기기(GKI, 전용 및 A/B 복구 포함)
기기에 recovery_a
및 recovery_b
파티션이 있으면 이 그림을 참고하세요.
Android 12로 출시 또는 업그레이드, 전용 및 비 A/B 복구(전용 램디스크)
그림 6. Android 12로 출시하거나 업그레이드하는 기기(GKI, 전용 및 비 A/B 복구 포함)
기기에 슬롯 접미사가 없는 recovery
라는 파티션이 있으면 이 그림을 참고하세요.
Android 12로 업그레이드, recovery-as-boot(recovery-as-ramdisk)
그림 7. Android 12로 업그레이드하는 기기, GKI 없음, recovery-as-boot
Android 12로 업그레이드, 전용 복구(전용 램디스크)
그림 8. Android 12로 업그레이드하는 기기, GKI 없음, 전용 복구
부팅 이미지 콘텐츠
Android 부팅 이미지에는 다음이 포함됩니다.
Android 13이 탑재된 기기에
init_boot
이미지 추가됨- 헤더 버전 V4
- 일반 램디스크 이미지
일반
boot
이미지vendor_boot
이미지(자세한 내용은 공급업체 부팅 파티션 참고)vendor_boot
헤더- 기기별
cmdline
(BOARD_KERNEL_CMDLINE
)
- 기기별
vendor_boot
램디스크 이미지lib/modules
- 복구 리소스(전용 복구가 없는 경우)
dtb
이미지
recovery
이미지- 헤더 버전 V2
- 기기별 복구
cmdline
(필요한 경우) - 비 A/B 복구 파티션의 경우 헤더 콘텐츠는 독립형이어야 합니다(복구 이미지 참고). 예:
cmdline
은boot
및vendor_boot
cmdline
에 연결되지 않습니다.- 헤더는 필요한 경우 복구 DTBO를 지정합니다.
- A/B 복구 파티션의 경우 콘텐츠는
boot
및vendor_boot
에서 연결되거나 추론될 수 있습니다. 예: cmdline
은boot
및vendor_boot
cmdline
에 연결됩니다.- DTBO는
vendor_boot
헤더에서 추론될 수 있습니다.
- 기기별 복구
recovery
램디스크 이미지- 복구 리소스
- 비 A/B 복구 파티션의 경우 램디스크 콘텐츠는 독립형이어야 합니다(복구 이미지 참고). 예:
lib/modules
에는 복구 모드 부팅에 필요한 커널 모듈이 모두 포함되어야 합니다.- 복구 램디스크에는
init
가 포함되어야 합니다. - A/B 복구 파티션의 경우 복구 램디스크는 일반 및
vendor_boot
램디스크 앞에 추가되므로 독립형일 필요가 없습니다. 예: lib/modules
에는vendor_boot
램디스크의 커널 모듈 외에 복구 모드를 부팅하는 데 필요한 추가 커널 모듈만 포함될 수 있습니다./init
의 심볼릭 링크는 존재할 수 있지만 부팅 이미지의 1단계/init
바이너리로 가려집니다.
- 헤더 버전 V2
일반 램디스크 이미지 콘텐츠
일반 램디스크에는 다음 구성요소가 포함됩니다.
init
- 추가된
system/etc/ramdisk/build.prop
ro.PRODUCT.bootimg.* build
속성- 마운트 지점의 빈 디렉터리:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
first_stage_ramdisk/
- 마운트 지점의 중복된 빈 디렉터리:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
- 마운트 지점의 중복된 빈 디렉터리:
부팅 이미지 통합
빌드 플래그는 init_boot
, boot
, recovery
, vendor_boot
이미지가 빌드되는 방식을 제어합니다.
불리언 보드 변수 값은 true
문자열이거나 비어 있어야 합니다(기본값).
TARGET_NO_KERNEL
. 이 변수는 빌드가 사전 빌드된 부팅 이미지를 사용하는지를 나타냅니다. 이 변수가true
로 설정되면BOARD_PREBUILT_BOOTIMAGE
를 사전 빌드된 부팅 이미지의 위치(BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img
)로 설정합니다.BOARD_USES_RECOVERY_AS_BOOT
. 이 변수는 기기가recovery
이미지를boot
이미지로 사용하는지를 나타냅니다. GKI를 사용할 때 이 변수는 비어 있고 복구 리소스는vendor_boot
로 이동해야 합니다.BOARD_USES_GENERIC_KERNEL_IMAGE
. 이 변수는 보드가 GKI를 사용함을 나타냅니다. 이 변수는 sysprops 또는PRODUCT_PACKAGES
에 영향을 미치지 않습니다.보드 수준 GKI 전환입니다. 아래 나열된 변수는 모두 이 변수로 제한됩니다.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
. 이 변수는 램디스크 복구 리소스가vendor_boot
에 빌드되는지를 제어합니다.true
로 설정하면 복구 리소스가vendor-ramdisk/
에만 빌드되고recovery/root/
에는 빌드되지 않습니다.비어 있으면 복구 리소스가
recovery/root/
에만 빌드되고vendor-ramdisk/
에는 빌드되지 않습니다.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
. 이 변수는 GSI AVB 키가vendor_boot
에 빌드되는지를 제어합니다.true
로 설정하면BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
는 다음과 같습니다.설정되면 GSI AVB 키가
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb
에 빌드됩니다.설정되지 않으면 GSI AVB 키가
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
에 빌드됩니다.
비어 있으면
BOARD_RECOVERY_AS_ROOT
는 다음과 같습니다.설정되면 GSI AVB 키가
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
에 빌드됩니다.설정되지 않으면 GSI AVB 키가
$ANDROID_PRODUCT_OUT/ramdisk/avb
에 빌드됩니다.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
. 이 변수는recovery
이미지에 커널이 포함되어 있는지를 제어합니다. Android 12로 출시되고 A/Brecovery
파티션을 사용하는 기기는 이 변수를true
로 설정해야 합니다. Android 12로 출시되고 비 A/B를 사용하는 기기는 이 변수를false
로 설정하여 복구 이미지를 독립적으로 유지해야 합니다.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
. 이 변수는$OUT/boot*.img
가 타겟 파일 아래IMAGES/
에 복사되는지를 제어합니다.aosp_arm64
는 이 변수를true
로 설정해야 합니다.다른 기기에서는 이 변수를 비워 두어야 합니다.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
. 이 변수는init_boot.img
의 생성 여부를 제어하고 크기를 설정합니다. 설정된 경우 일반 램디스크가boot.img
대신init_boot.img
에 추가되며 체이닝된 vbmeta의BOARD_AVB_INIT_BOOT*
변수를 설정해야 합니다.
허용된 조합
구성요소 또는 변수 | recovery 파티션이 없는 기기 업그레이드 |
recovery 파티션이 있는 기기 업그레이드 |
recovery 파티션 없이 기기 출시 |
A/B recovery 파티션으로 기기 출시 |
비 A/B recovery 파티션으로 기기 출시 |
aosp_arm64 |
---|---|---|---|---|---|---|
boot 포함 |
예 | 예 | 예 | 예 | 예 | 예 |
init_boot 포함(Android 13) |
아니요 | 아니요 | 아니요 | 예 | 예 | 예 |
vendor_boot 포함 |
선택사항 | 선택사항 | 예 | 예 | 예 | 아니요 |
recovery 포함 |
아니요 | 예 | 아니요 | 예 | 예 | 아니요 |
BOARD_USES_RECOVERY_AS_BOOT |
true |
비어 있음 | 비어 있음 | 비어 있음 | 비어 있음 | 비어 있음 |
BOARD_USES_GENERIC_KERNEL_IMAGE |
비어 있음 | 비어 있음 | true |
true |
true |
true |
PRODUCT_BUILD_RECOVERY_IMAGE |
비어 있음 | true 또는 비어 있음 |
비어 있음 | true 또는 비어 있음 |
true 또는 비어 있음 |
비어 있음 |
BOARD_RECOVERYIMAGE_PARTITION_SIZE |
비어 있음 | > 0 | 비어 있음 | > 0 | > 0 | 비어 있음 |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT |
비어 있음 | 비어 있음 | true |
비어 있음 | 비어 있음 | 비어 있음 |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT |
비어 있음 | 비어 있음 | true |
true |
true |
비어 있음 |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE |
비어 있음 | 비어 있음 | 비어 있음 | true |
비어 있음 | 비어 있음 |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES |
비어 있음 | 비어 있음 | 비어 있음 | 비어 있음 | 비어 있음 | true |
전용 recovery
파티션이 있는 기기는 PRODUCT_BUILD_RECOVERY_IMAGE
를 true
또는 비어 있도록 설정할 수 있습니다. 이러한 기기의 경우 BOARD_RECOVERYIMAGE_PARTITION_SIZE
가 설정되면 recovery
이미지가 빌드됩니다.
부팅을 위해 체이닝된 vbmeta 사용 설정
체이닝된 vbmeta는 boot
및 init_boot
이미지에 사용 설정해야 합니다. 다음 사항을 지정합니다.
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
예는 이 변경사항을 참고하세요.
System-as-root
system-as-root는 GKI를 사용하는 기기에서 지원되지 않습니다. 이러한 기기에서는 BOARD_BUILD_SYSTEM_ROOT_IMAGE
가 비어 있어야 합니다. system-as-root는 동적 파티션을 사용하는 기기에서도 지원되지 않습니다.
제품 구성
일반 램디스크를 사용하는 기기는 램디스크에 설치할 수 있는 파일 목록을 설치해야 합니다. 이렇게 하려면 device.mk
에서 다음을 지정합니다.
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
generic_ramdisk.mk
파일은 다른 makefile이 다른 파일을 실수로 램디스크에 설치하는 것도 방지합니다(대신 이러한 파일을 vendor_ramdisk
로 이동).
기기 설정
설정 안내는 Android 13으로 출시되는 기기, Android 12로 업그레이드되는 기기, Android 12로 출시되는 기기에 따라 다릅니다. Android 13은 Android 12와 유사한 방식으로 설정됩니다.
Android 12로 업그레이드하는 기기:
BOARD_USES_RECOVERY_AS_BOOT
값을 유지할 수 있습니다. 값을 유지하면 기존 구성을 사용하고 있으므로 새 빌드 변수는 비어 있어야 합니다. 이러한 기기의 경우 다음과 같습니다.BOARD_USES_RECOVERY_AS_BOOT
를 공백으로 설정할 수 있습니다. 공백으로 설정하면 새 구성을 사용하는 것입니다. 이러한 기기의 경우 다음과 같습니다.
Android 12로 출시되는 기기는
BOARD_USES_RECOVERY_AS_BOOT
를 공백으로 설정하고 새 구성을 사용해야 합니다. 이러한 기기의 경우 다음과 같습니다.
aosp_arm64
는 GKI만 빌드하고 vendor_boot
나 복구는 빌드하지 않으므로 완전한 타겟이 아닙니다. aosp_arm64
빌드 구성은 generic_arm64
를 참고하세요.
옵션 1: 전용 복구 파티션 없음
recovery
파티션이 없는 기기에는 boot
파티션에 일반 boot
이미지가 있습니다. vendor_boot
램디스크에는 공급업체 커널 모듈이 있는 lib/modules
를 비롯한 복구 리소스가 모두 포함되어 있습니다. 이러한 기기에서 제품 구성은 generic_ramdisk.mk
에서 상속받습니다.
보드 값 설정
다음 값을 설정합니다.
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
init 바이너리 및 심볼릭 링크
vendor_boot
램디스크에는 /init
-> /system/bin/init
심볼릭 링크와 /system/bin/init
의 init_second_stage.recovery
가 포함될 수 있습니다. 그러나 일반 램디스크는 vendor_boot
램디스크 다음에 연결되므로 /init
심볼릭 링크를 덮어씁니다. 기기가 복구로 부팅될 때 /system/bin/init
바이너리는 2단계 init를 지원하는 데 필요합니다. vendor_boot
+ 일반 램디스크의 콘텐츠는 다음과 같습니다.
/init
(일반 램디스크에서,init_first_stage
에서 빌드됨)/system/bin/init
(vendor_ramdisk
에서,init_second_stage.recovery
에서 빌드됨)
fstab 파일 이동
일반 램디스크에 설치된 fstab
파일을 모두 vendor_ramdisk
로 이동합니다. 예는 이 변경사항을 참고하세요.
모듈 설치
원하는 경우 기기별 모듈을 vendor_ramdisk
에 설치할 수 있습니다. 설치할 기기별 모듈이 없다면 이 단계를 건너뛰세요.
모듈이
/first_stage_ramdisk
에 설치될 때 모듈의vendor_ramdisk
변형을 사용합니다. 이 모듈은init
가 루트를/first_stage_ramdisk
로 전환한 후, 그러나init
가 루트를/system
으로 전환하기 전에 사용할 수 있어야 합니다. 예는 메타데이터 체크섬과 가상 A/B 압축을 참고하세요.모듈이
/
에 설치될 때 모듈의recovery
변형을 사용합니다. 이 모듈은init
가 루트를/first_stage_ramdisk
로 전환하기 전에 사용할 수 있어야 합니다./
에 모듈을 설치하는 방법에 관한 자세한 내용은 1단계 콘솔을 참고하세요.
1단계 콘솔
1단계 콘솔은 init
가 루트를 /first_stage_ramdisk
로 전환하기 전에 시작되므로 모듈의 recovery
변형을 설치해야 합니다.
기본적으로 두 모듈 변형은 모두 build/make/target/product/base_vendor.mk
에 설치되므로 기기 makefile이 이 파일에서 상속받는다면 recovery
변형을 명시적으로 설치하지 않아도 됩니다.
복구 모듈을 명시적으로 설치하려면 다음을 사용합니다.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
이렇게 하면 linker
, sh
, toybox
가 $ANDROID_PRODUCT_OUT/recovery/root/system/bin
에 설치된 후 vendor_ramdisk
아래 /system/bin
에 설치됩니다.
1단계 콘솔에 필요한 모듈(예: adbd)을 추가하려면 다음을 사용합니다.
PRODUCT_PACKAGES += adbd.recovery
이렇게 하면 지정된 모듈이 $ANDROID_PRODUCT_OUT/recovery/root/system/bin
에 설치된 후 vendor_ramdisk
아래 /system/bin
에 설치됩니다.
메타데이터 체크섬
1단계 마운트 중 메타데이터 체크섬을 지원하기 위해 GKI를 지원하지 않는 기기는 다음 모듈의 램디스크 변형을 설치합니다. GKI 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
으로 이동합니다.
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
예는 이 변경사항 목록을 참고하세요.
가상 A/B 압축
가상 A/B 압축을 지원하려면 snapuserd
를 vendor_ramdisk
에 설치해야 합니다. 기기는 snapuserd
의 vendor_ramdisk
변형을 설치하는 virtual_ab_ota/compression.mk
에서 상속받아야 합니다.
부팅 프로세스 변경사항
복구로 부팅 또는 Android로 부팅 프로세스는 변경되지 않지만 다음의 경우는 예외입니다.
- 램디스크
build.prop
은/second_stage_resources
로 이동하여 2단계init
가 부팅의 빌드 타임스탬프를 읽을 수 있도록 합니다.
리소스가 일반 램디스크에서 vendor_boot
램디스크로 이동하므로 일반 램디스크를 vendor_boot
램디스크에 연결하는 결과가 변경되지 않습니다.
e2fsck 사용 가능하게 만들기
기기 makefile은 다음에서 상속받을 수 있습니다.
virtual_ab_ota/launch_with_vendor_ramdisk.mk
: 기기에서 가상 A/B를 지원하지만 압축은 지원하지 않는 경우virtual_ab_ota/compression.mk
: 기기에서 가상 A/B 압축을 지원하는 경우
제품 makefile은 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
를 설치합니다. 런타임에 1단계 init
는 루트를 /first_stage_ramdisk
로 전환하고 /system/bin/e2fsck
를 실행합니다.
옵션 2a: 전용 및 A/B 복구 파티션
A/B recovery
파티션이 있는 기기, 즉 recovery_a
와 recovery_b partition
이 있는 기기에 이 옵션을 사용합니다. 이러한 기기에는 다음 구성으로 복구 파티션을 업데이트할 수 있는 A/B 및 가상 A/B 기기가 포함됩니다.
AB_OTA_PARTITIONS += recovery
vendor_boot
램디스크에는 다음을 포함하여 램디스크 및 공급업체 커널 모듈의 공급업체 비트가 포함되어 있습니다.
기기별
fstab
파일lib/modules
(공급업체 커널 모듈 포함)
recovery
램디스크에는 복구 리소스가 모두 포함되어 있습니다. 이러한 기기에서 제품 구성은 generic_ramdisk.mk
에서 상속받습니다.
보드 값 설정
A/B recovery
파티션이 있는 기기에 다음 값을 설정합니다.
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
init 바이너리 및 심볼릭 링크
recovery
램디스크에는 /init -> /system/bin/init
심볼릭 링크와 /system/bin/init
의 init_second_stage.recovery
가 포함될 수 있습니다. 그러나 부팅 램디스크는 recovery
램디스크 다음에 연결되므로 /init
심볼릭 링크를 덮어씁니다. 기기가 복구 모드로 부팅될 때 /system/bin/init
바이너리는 2단계 init를 지원하는 데 필요합니다.
기기가 recovery
로 부팅되면 recovery
+ vendor_boot
+ 일반 램디스크의 콘텐츠는 다음과 같습니다.
/init
(램디스크에서,init_first_stage
에서 빌드됨)/system/bin/init
(recovery
램디스크에서,init_second_stage.recovery
에서 빌드됨,/init
에서 실행됨)
기기가 Android로 부팅될 때 vendor_boot
+ 일반 램디스크의 콘텐츠는 다음과 같습니다.
/init
(일반 램디스크에서,init_first_stage
에서 빌드됨)
fstab 파일 이동
일반 램디스크에 설치된 fstab
파일을 모두 vendor_ramdisk
로 이동합니다. 예는 이 변경사항을 참고하세요.
모듈 설치
원하는 경우 기기별 모듈을 vendor_ramdisk
에 설치할 수 있습니다. 설치할 기기별 모듈이 없다면 이 단계를 건너뛰세요. Init
는 루트를 전환하지 않습니다. 모듈의 vendor_ramdisk
변형은 vendor_ramdisk
의 루트에 설치됩니다. vendor_ramdisk
에 모듈을 설치하는 방법에 관한 예는 1단계 콘솔, 메타데이터 체크섬, 가상 A/B 압축을 참고하세요.
1단계 콘솔
모듈의 vendor_ramdisk
변형을 설치하려면 다음을 사용합니다.
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
이렇게 하면 linker
, sh
, toybox
가 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
에 설치된 후 vendor_ramdisk
아래 /system/bin
에 설치됩니다.
1단계 콘솔에 필요한 모듈(예: adbd)을 추가하려면 AOSP에 관련 패치를 업로드하여 이러한 모듈의 vendor_ramdisk
변형을 사용 설정하고 다음을 사용합니다.
PRODUCT_PACKAGES += adbd.vendor_ramdisk
이렇게 하면 지정된 모듈이 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
에 설치됩니다. vendor_boot
램디스크가 복구 모드로 로드되면 모듈은 recovery
에서도 사용할 수 있습니다. vendor_boot
램디스크가 복구 모드로 로드되지 않으면 기기는 adbd.recovery
도 선택적으로 설치할 수 있습니다.
메타데이터 체크섬
1단계 마운트 중 메타데이터 체크섬을 지원하기 위해 GKI를 지원하지 않는 기기는 다음 모듈의 램디스크 변형을 설치합니다. GKI 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
으로 이동합니다.
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
예는 이 변경사항 목록을 참고하세요.
가상 A/B 압축
가상 A/B 압축을 지원하려면 snapuserd
를 vendor_ramdisk
에 설치해야 합니다. 기기는 snapuserd
의 vendor_ramdisk
변형을 설치하는 virtual_ab_ota/compression.mk
에서 상속받아야 합니다.
부팅 프로세스 변경사항
Android로 부팅할 때 부팅 프로세스는 변경되지 않습니다. vendor_boot
+ 일반 램디스크는 기존 부팅 프로세스와 비슷하지만 fstab
이 vendor_boot
에서 로드된다는 점은 다릅니다. system/bin/recovery
가 없으므로 first_stage_init
는 일반 부팅으로 처리합니다.
복구 모드로 부팅할 때는 부팅 프로세스가 변경됩니다. 복구 + vendor_boot
+ 일반 램디스크는 기존 복구 프로세스와 비슷하지만 커널은 recovery
이미지가 아닌 boot
이미지에서 로드됩니다.
복구 모드의 부팅 프로세스는 다음과 같습니다.
부트로더가 시작된 후 다음을 실행합니다.
- 복구 +
vendor_boot
+ 일반 램디스크를/
로 푸시합니다. (OEM이 커널 모듈을BOARD_RECOVERY_KERNEL_MODULES
에 추가하여 복구 램디스크에 복제하는 경우vendor_boot
는 선택사항입니다.) boot
파티션에서 커널을 실행합니다.
- 복구 +
커널이 램디스크를
/
에 마운트하고 일반 램디스크에서/init
를 실행합니다.1단계 init가 시작된 후 다음을 실행합니다.
IsRecoveryMode() == true
와ForceNormalBoot() == false
를 설정합니다./lib/modules
에서 공급업체 커널 모듈을 로드합니다.DoFirstStageMount()
를 호출하지만IsRecoveryMode() == true
이므로 마운트를 건너뜁니다. 기기는 램디스크를 해제하지 않지만(/
가 여전히 동일하기 때문)SetInitAvbVersionInRecovery()
는 호출합니다.recovery
램디스크의/system/bin/init
에서 2단계 init를 시작합니다.
e2fsck 사용 가능하게 만들기
기기 makefile은 다음에서 상속받을 수 있습니다.
virtual_ab_ota/launch_with_vendor_ramdisk.mk
: 기기에서 가상 A/B를 지원하지만 압축은 지원하지 않는 경우virtual_ab_ota/compression.mk
: 기기에서 가상 A/B 압축을 지원하는 경우
제품 makefile은 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
를 설치합니다. 런타임에 1단계 init
는 /system/bin/e2fsck
를 실행합니다.
옵션 2b: 전용 및 비 A/B 복구 파티션
비 A/B recovery
파티션이 있는 기기, 즉 슬롯 접미사가 없는 recovery
라는 파티션이 있는 기기에 이 옵션을 사용합니다. 이러한 기기는 다음과 같습니다.
- 비 A/B 기기
- 복구 파티션을 업데이트할 수 없는 A/B 및 가상 A/B 기기 특이한 경우입니다.
vendor_boot
램디스크에는 다음을 포함하여 램디스크 및 공급업체 커널 모듈의 공급업체 비트가 포함되어 있습니다.
- 기기별
fstab
파일 lib/modules
(공급업체 커널 모듈 포함)
recovery
이미지는 독립적이어야 합니다. 여기에는 다음을 비롯하여 복구 모드를 부팅하는 데 필요한 리소스가 모두 포함되어야 합니다.
- 커널 이미지
- DTBO 이미지
lib/modules
의 커널 모듈/init -> /system/bin/init
심볼릭 링크로서의 1단계 init- 2단계 init 바이너리
/system/bin/init
- 기기별
fstab
파일 recovery
바이너리 등을 포함한 기타 모든 복구 리소스- 등
이러한 기기에서 제품 구성은 generic_ramdisk.mk
에서 상속받습니다.
보드 값 설정
비 A/B 기기에 다음 값을 설정합니다.
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
init 바이너리 및 심볼릭 링크
recovery
램디스크에는 /init -> /system/bin/init
심볼릭 링크와 /system/bin/init
의 init_second_stage.recovery
가 포함되어야 합니다. 기기가 복구 모드로 부팅될 때 /system/bin/init
바이너리는 1단계와 2단계 init를 모두 지원하는 데 필요합니다.
기기가 recovery
로 부팅되면 recovery
램디스크의 콘텐츠는 다음과 같습니다.
/init -> /system/bin/init
(recovery
램디스크에서)/system/bin/init
(recovery
램디스크에서,init_second_stage.recovery
에서 빌드됨,/init
에서 실행됨)
기기가 Android로 부팅될 때 vendor_boot
+ 일반 램디스크의 콘텐츠는 다음과 같습니다.
/init
(램디스크에서,init_first_stage
에서 빌드됨)
fstab 파일 이동
일반 램디스크에 설치된 fstab
파일을 모두 vendor_ramdisk
및 recovery
램디스크로 이동합니다. 예는 이 변경사항을 참고하세요.
모듈 설치
원하는 경우 기기별 모듈을 vendor_ramdisk
및 recovery
램디스크에 설치할 수 있습니다. 설치할 기기별 모듈이 없다면 이 단계를 건너뛰세요. init
는 루트를 전환하지 않습니다. 모듈의 vendor_ramdisk
변형은 vendor_ramdisk
의 루트에 설치됩니다. 모듈의 recovery
변형은 recovery
램디스크의 루트에 설치됩니다. vendor_ramdisk
및 recovery
램디스크에 모듈을 설치하는 방법에 관한 예는 1단계 콘솔과 메타데이터 체크섬을 참고하세요.
1단계 콘솔
모듈의 vendor_ramdisk
변형을 설치하려면 다음을 사용합니다.
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
이렇게 하면 linker
, sh
, toybox
가 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
에 설치된 후 vendor_ramdisk
아래 /system/bin
에 설치됩니다.
1단계 콘솔에 필요한 모듈(예: adbd)을 추가하려면 AOSP에 관련 패치를 업로드하여 이러한 모듈의 vendor_ramdisk
변형을 사용 설정하고 다음을 사용합니다.
PRODUCT_PACKAGES += adbd.vendor_ramdisk
이렇게 하면 지정된 모듈이 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
에 설치됩니다.
모듈의 recovery
변형을 설치하려면 vendor_ramdisk
를 recovery
로 바꿉니다.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
메타데이터 체크섬
1단계 마운트 중 메타데이터 체크섬을 지원하기 위해 GKI를 지원하지 않는 기기는 다음 모듈의 램디스크 변형을 설치합니다. GKI 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
으로 이동합니다.
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
복구의 1단계 마운트 중에 메타데이터 체크섬을 지원하려면 이러한 모듈의 복구 변형을 사용 설정하고 설치합니다.
부팅 프로세스 변경사항
Android로 부팅할 때 부팅 프로세스는 변경되지 않습니다. vendor_boot
+ 일반 램디스크는 기존 부팅 프로세스와 비슷하지만 fstab
이 vendor_boot
에서 로드된다는 점은 다릅니다. system/bin/recovery
가 없으므로 first_stage_init
는 일반 부팅으로 처리합니다.
복구 모드로 부팅할 때 부팅 프로세스는 변경되지 않습니다. 복구 램디스크는 기존 복구 프로세스와 같은 방식으로 로드됩니다.
커널은 recovery
이미지에서 로드됩니다. 복구 모드의 부팅 프로세스는 다음과 같습니다.
부트로더가 시작된 후 다음을 실행합니다.
- 복구 램디스크를
/
로 푸시합니다. recovery
파티션에서 커널을 실행합니다.
- 복구 램디스크를
커널은 램디스크를
/
에 마운트하고recovery
램디스크의/system/bin/init
심볼릭 링크인/init
를 실행합니다.1단계 init가 시작된 후 다음을 실행합니다.
IsRecoveryMode() == true
와ForceNormalBoot() == false
를 설정합니다./lib/modules
에서 공급업체 커널 모듈을 로드합니다.DoFirstStageMount()
를 호출하지만IsRecoveryMode() == true
이므로 마운트를 건너뜁니다. 기기는 램디스크를 해제하지 않지만(/
가 여전히 동일하기 때문)SetInitAvbVersionInRecovery()
는 호출합니다.recovery
램디스크의/system/bin/init
에서 2단계 init를 시작합니다.
부팅 이미지 타임스탬프
다음 코드는 boot
이미지 타임스탬프 파일을 보여주는 예입니다.
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
빌드 시간에
system/etc/ramdisk/build.prop
파일은 일반 램디스크에 추가됩니다. 이 파일에는 빌드의 타임스탬프 정보가 포함되어 있습니다.런타임에 1단계
init
는 램디스크에서tmpfs
로 파일을 복사한 후 램디스크를 해제하여 2단계init
가 이 파일을 읽고boot
이미지 타임스탬프 속성을 설정할 수 있도록 합니다.