Android 12에서 일반 boot
이미지에는 일반 boot
램디스크와 일반 커널 이미지(GKI)가 포함 됩니다. 일반 램디스크를 빌드하려면 일반 램디스크에 1단계 init
및 타임스탬프 정보가 포함된 속성 파일만 포함되도록 램디스크에서 공급업체별 리소스를 이동합니다.
다음과 같은 기기에서:
전용
recovery
파티션을 사용하지 마십시오. 모든 복구 비트는 부트 램디스크에서vendor_boot
램디스크로 이동합니다.전용
recovery
파티션을 사용하십시오.recovery
램디스크는 자체 포함되어 있으므로recovery
램디스크를 변경할 필요가 없습니다.
건축물
다음 다이어그램은 Android 12를 실행하는 기기의 아키텍처를 보여줍니다.
Android 12 실행 또는 업그레이드, 전용 복구 없음
그림 1. 전용 복구가 없는 GKI를 사용하여 Android 12를 시작하거나 업그레이드하는 기기
Android 12, 전용 및 A/B 복구 실행 또는 업그레이드(전용 ramdisk)
그림 2a. GKI, 전용 및 A/B 복구를 사용하여 Android 12를 시작하거나 업그레이드하는 기기
recovery
가 A/B인 경우 이 그림을 참조하십시오. 즉, 장치에 recovery_a
및 recovery_b
파티션이 있습니다.
Android 12 실행 또는 업그레이드, 전용 및 비 A/B 복구(전용 ramdisk)
그림 2b. GKI, 전용 및 비 A/B 복구를 사용하여 Android 12를 시작하거나 업그레이드하는 기기
recovery
가 A/B가 아닌 경우 이 그림을 참조하십시오. 즉, 장치에 슬롯 접미사가 없는 recovery
라는 파티션이 있습니다.
Android 12로 업그레이드, 부팅 시 복구(ramdisk로 복구)
그림 3. GKI가 없는 Android 12로 업그레이드하는 기기, 부팅 시 복구
Android 12로 업그레이드, 전용 복구(전용 ramdisk)
그림 4. Android 12로 업그레이드하는 기기, GKI 없음, 전용 복구
부팅 이미지 콘텐츠
Android 12에서 부팅 이미지에는 다음이 포함됩니다.
- 일반
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 복구 파티션의 경우 ramdisk의 내용은 독립 실행형이어야 합니다. 복구 이미지 를 참조하십시오. 예를 들어:
-
lib/modules
는 복구 모드를 부팅하는 데 필요한 모든 커널 모듈을 포함해야 합니다. - 복구 램디스크에는
init
가 포함되어야 합니다. - A/B 복구 파티션의 경우 복구 램디스크가
boot
및vendor_boot
램디스크 앞에 추가되므로 독립 실행형일 필요가 없습니다. 예를 들어: -
lib/modules
에는vendor_boot
ramdisk의 커널 모듈 외에 복구 모드를 부팅하는 데 필요한 추가 커널 모듈만 포함될 수 있습니다. -
/init
에 심볼릭 링크가 있을 수 있지만 부팅 이미지의 첫 번째 단계/init
바이너리에 의해 가려집니다.
- 헤더 버전 V2
일반 부팅 램디스크 이미지 내용
Android 12에서 일반 boot
램디스크에는 다음 구성요소가 포함됩니다.
-
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/
- 마운트 지점에 대해 중복된 빈 디렉토리:
부팅 이미지 통합
빌드 플래그는 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 및 일반boot
이미지를 사용함을 나타냅니다. 이 변수는 sysprops 또는PRODUCT_PACKAGES
에 영향을 미치지 않습니다.이것은 보드 수준의 GKI 스위치입니다. 아래 나열된 모든 변수는 이 변수에 의해 제한됩니다.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
. 이 변수는 ramdisk 복구 리소스가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
로 설정해야 합니다.다른 장치는 이 변수를 비워 두어야 합니다.
허용되는 조합
구성 요소 또는 변수 | recovery 파티션 없이 장치 업데이트 | recovery 파티션으로 장치 업데이트 | recovery 파티션 없이 장치 실행 | A/B recovery 파티션이 있는 장치 실행 | A/B가 아닌 recovery 파티션이 있는 기기 시작 | aosp_arm64 |
---|---|---|---|---|---|---|
boot 포함 | 예 | 예 | 예 | 예 | 예 | 예 |
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_RESOURCE_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 사용
boot
이미지에 대해 연결된 vbmeta를 활성화해야 합니다. 다음을 지정합니다.
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
예를 들어 이 변경 사항 을 참조하십시오.
루트로서의 시스템
루트로서의 시스템은 장치가 업데이트 가능한 GKI 모듈을 지원하는지 여부에 관계없이 GKI 및 일반 부팅 이미지를 사용하는 장치에 대해 지원되지 않습니다. 이러한 장치에서 BOARD_BUILD_SYSTEM_ROOT_IMAGE
는 비어 있어야 합니다. 업데이트 가능한 GKI 모듈을 사용하기 위한 요구 사항인 동적 파티션을 사용하는 장치에서는 루트로서의 시스템도 지원되지 않습니다.
제품 구성
일반 램디스크를 사용하는 장치는 램디스크에 설치할 수 있는 파일 목록을 설치해야 합니다. 이렇게 하려면 device.mk
에서 다음을 지정합니다.
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
또한 generic_ramdisk.mk
파일은 다른 makefile이 실수로 다른 파일을 ramdisk에 설치하는 것을 방지합니다(이러한 파일을 대신 vendor_ramdisk
로 이동).
장치 설정
설정 지침은 Android 12로 업데이트하는 기기와 Android 12로 시작하는 기기 간에 다릅니다.
Android 12로 업데이트하는 기기:
BOARD_USES_RECOVERY_AS_BOOT
값을 유지할 수 있습니다. 그렇게 하는 경우 레거시 구성을 사용하고 있으며 새 빌드 변수는 비어 있어야 합니다. 그러한 장치의 경우:BOARD_USES_RECOVERY_AS_BOOT
를 공백으로 설정할 수 있습니다. 그렇게 하면 새로운 구성을 사용하는 것입니다. 그러한 장치의 경우:
Android 12로 출시되는 기기는
BOARD_USES_RECOVERY_AS_BOOT
를 비우도록 설정하고 새 구성을 사용해야 합니다. 그러한 장치의 경우:
aosp_arm64
는 GKI 및 일반 boot
이미지만 빌드하기 때문에( vendor_boot
또는 복구가 아님) 완전한 대상이 아닙니다. aosp_arm64
빌드 구성은 generic_arm64
를 참조하세요.
옵션 1: 전용 복구 파티션 없음
recovery
파티션이 없는 장치는 boot
파티션에 일반 boot
이미지를 포함합니다. vendor_boot
램디스크에는 lib/modules
(공급업체 커널 모듈 포함)를 포함한 모든 복구 리소스가 포함되어 있습니다. 이러한 장치에서 제품 구성은 generic_ramdisk.mk
에서 상속 됩니다.
BOARD 값 설정
다음 값을 설정합니다.
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
바이너리 및 심볼릭 링크 초기화
vendor_boot
램디스크는 /system/bin/init
/init
/system/bin/init
init_second_stage.recovery
포함할 수 있습니다. 그러나 boot
ramdisk는 vendor_boot
ramdisk 이후에 연결되기 때문에 /init
심볼릭 링크를 덮어씁니다. 장치가 복구로 부팅될 때 /system/bin/init
바이너리는 두 번째 단계 초기화를 지원하는 데 필요합니다. vendor_boot
+ boot
ramdisks의 내용은 다음과 같습니다.
-
/init
(ramdisk에서,init_first_stage
에서 빌드) -
/system/bin/init
(vendor_ramdisk
에서 빌드된init_second_stage.recovery
에서)
fstab 파일 이동
boot
램디스크에 설치된 모든 fstab
파일을 vendor_ramdisk
로 이동합니다. 예를 들어 이 변경 사항 을 참조하십시오.
모듈 설치
원하는 경우 장치별 모듈을 vendor_ramdisk
에 설치할 수 있습니다(설치할 장치별 모듈이 없는 경우 이 단계 건너뛰기).
모듈이
/first_stage_ramdisk
에 설치될 때 모듈의vendor_ramdisk
변형을 사용하십시오. 이 모듈은init
가 root를/first_stage_ramdisk
로 전환한 후 그러나init
가 root를/system
으로 전환하기 전에 사용할 수 있어야 합니다. 예는 메타데이터 체크섬 및 가상 A/B 압축 을 참조하십시오.모듈이
/
에 설치될 때 모듈의recovery
변형을 사용하십시오. 이 모듈은init
가 root를/first_stage_ramdisk
로 전환하기 전에 사용할 수 있어야 합니다./
에 모듈을 설치하는 방법에 대한 자세한 내용은 첫 번째 단계 콘솔 을 참조하십시오.
1단계 콘솔
init
가 root를 /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
에 설치됩니다.
메타데이터 체크섬
첫 번째 단계 마운트 동안 메타데이터 체크섬 을 지원하기 위해 GKI를 지원하지 않는 장치는 다음 모듈의 ramdisk 변형을 설치합니다. GKI에 대한 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
으로 이동하십시오.
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
예를 들어 이 변경 목록 을 참조하십시오.
가상 A/B 압축
가상 A/B 압축을 지원하려면 snapuserd
를 vendor_ramdisk
에 설치해야 합니다. 장치는 snapuserd
의 vendor_ramdisk
변형을 설치하는 virtual_ab_ota/compression.mk
에서 상속해야 합니다.
부팅 프로세스의 변경 사항
복구 또는 Android로 부팅하는 프로세스는 다음을 제외하고 변경되지 않습니다.
- Ramdisk
build.prop
은/second_stage_resources
로 이동하여 두 번째 단계init
가 부팅의 빌드 타임스탬프를 읽을 수 있도록 합니다.
리소스가 boot
램디스크에서 vendor_boot
boot
vendor_boot
로 연결한 결과는 변경되지 않습니다.
e2fsck를 사용 가능하게 만들기
장치 메이크파일은 다음에서 상속할 수 있습니다.
장치가 가상 A/B를 지원하지만 압축은 지원하지 않는 경우
virtual_ab_ota/launch_with_vendor_ramdisk.mk
.장치가 가상 A/B 압축을 지원하는 경우
virtual_ab_ota/compression.mk
compression.mk.
제품 메이크파일 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
를 설치합니다. 런타임에 첫 번째 단계 init
는 root를 /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
ramdisk에는 다음을 포함하여 ramdisk 및 공급업체 커널 모듈의 공급업체 비트가 포함되어 있습니다.
장치별
fstab
파일lib/modules
(공급업체 커널 모듈 포함)
recovery
램디스크에는 모든 복구 리소스가 포함되어 있습니다. 이러한 장치에서 제품 구성은 generic_ramdisk.mk
에서 상속 됩니다.
BOARD 값 설정
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
바이너리 및 심볼릭 링크 초기화
recovery
램디스크는 /init -> /system/bin/init
심볼릭 링크와 /system/bin/init
의 init_second_stage.recovery
를 포함할 수 있습니다. 그러나 부팅 램디스크는 recovery
램디스크 이후에 연결되기 때문에 /init
심볼릭 링크를 덮어씁니다. 장치가 복구 모드로 부팅되면 두 번째 단계 초기화를 지원하기 위해 /system/bin/init
바이너리가 필요합니다.
장치가 recovery
로 부팅될 때 recovery
+ vendor_boot
+ boot
ramdisks의 내용은 다음과 같습니다.
-
/init
(ramdisk에서,init_first_stage
에서 빌드) -
/system/bin/init
(recovery
ramdisk에서,init_second_stage.recovery
에서 빌드,/init
에서 실행)
장치가 Android로 부팅될 때 vendor_boot
+ boot
ramdisks의 내용은 다음과 같습니다.
-
/init
(ramdisk에서,init_first_stage
에서 빌드)
fstab 파일 이동
boot
램디스크에 설치된 모든 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
에 설치됩니다.
첫 번째 단계 콘솔에 필요한 모듈(예: adbd)을 추가하려면 관련 패치를 AOSP에 업로드하여 이러한 모듈의 vendor_ramdisk
변형을 활성화한 후 다음을 사용합니다.
PRODUCT_PACKAGES += adbd.vendor_ramdisk
이렇게 하면 지정된 모듈이 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
설치됩니다. vendor_boot
램디스크가 복구 모드에서 로드된 경우 모듈은 recovery
에서도 사용할 수 있습니다. vendor_boot
ramdisk가 복구 모드에서 로드되지 않은 경우 장치는 선택적으로 adbd.recovery
도 설치할 수 있습니다.
메타데이터 체크섬
첫 번째 단계 마운트 동안 메타데이터 체크섬 을 지원하기 위해 GKI를 지원하지 않는 장치는 다음 모듈의 ramdisk 변형을 설치합니다. GKI에 대한 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
으로 이동하십시오.
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
예를 들어 이 변경 목록 을 참조하십시오.
가상 A/B 압축
가상 A/B 압축을 지원하려면 snapuserd
를 vendor_ramdisk
에 설치해야 합니다. 장치는 snapuserd
의 vendor_ramdisk
변형을 설치하는 virtual_ab_ota/compression.mk
에서 상속해야 합니다.
부팅 프로세스의 변경 사항
Android로 부팅할 때 부팅 프로세스는 변경되지 않습니다. vendor_boot
+ boot
ramdisk는 fstab
이 vendor_boot
에서 로드된다는 점을 제외하면 기존 부팅 프로세스와 유사합니다. system/bin/recovery
가 존재하지 않기 때문에 first_stage_init
는 이를 일반 부팅으로 처리합니다.
복구 모드로 부팅하면 부팅 프로세스가 변경됩니다. Recovery + vendor_boot
+ boot
램디스크는 기존 복구 프로세스와 유사하지만 커널이 recovery
이미지가 아닌 boot
이미지에서 로드됩니다. 복구 모드의 부팅 과정은 다음과 같습니다.
부트로더가 시작된 후 다음을 수행합니다.
- Recovery +
vendor_boot
+boot
ramdisk를/
로 푸시합니다. (OEM이BOARD_RECOVERY_KERNEL_MODULES
에 추가하여 복구 램디스크에 커널 모듈을 복제하는 경우,vendor_boot
는 선택 사항입니다.) -
boot
파티션에서 커널을 실행합니다.
- Recovery +
커널은 ramdisk를
/
에 마운트한 다음boot
ramdisk에서/init
를 실행합니다.첫 번째 단계 init가 시작된 후 다음을 수행합니다.
-
IsRecoveryMode() == true
및ForceNormalBoot() == false
를 설정합니다. -
/lib/modules
modules 에서 공급업체 커널 모듈을 로드합니다. -
DoFirstStageMount()
를 호출하지만IsRecoveryMode() == true
이므로 마운트를 건너뜁니다. (장치는 램디스크를 해제하지 않지만(/
이 여전히 동일하기 때문에)SetInitAvbVersionInRecovery()
를 호출합니다.) -
recovery
램디스크의/system/bin/init
에서 두 번째 단계 초기화를 시작합니다.
-
e2fsck를 사용 가능하게 만들기
장치 메이크파일은 다음에서 상속할 수 있습니다.
장치가 가상 A/B를 지원하지만 압축은 지원하지 않는 경우
virtual_ab_ota/launch_with_vendor_ramdisk.mk
.장치가 가상 A/B 압축을 지원하는 경우
virtual_ab_ota/compression.mk
compression.mk.
제품 메이크파일 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
를 설치합니다. 런타임 시 첫 번째 단계 init
는 /system/bin/e2fsck
를 실행합니다.
옵션 2b: 전용 및 비 A/B 복구 파티션
A/B가 아닌 recovery
파티션이 있는 장치에 이 옵션을 사용하십시오. 즉, 장치에 슬롯 접미사가 없는 recovery
라는 파티션이 있습니다. 이러한 장치에는 다음이 포함됩니다.
- 비 A/B 기기;
- 복구 파티션을 업데이트할 수 없는 A/B 및 가상 A/B 장치. (이것은 비정상적입니다.)
vendor_boot
ramdisk에는 다음을 포함하여 ramdisk 및 공급업체 커널 모듈의 공급업체 비트가 포함되어 있습니다.
- 장치별
fstab
파일 -
lib/modules
(공급업체 커널 모듈 포함)
recovery
이미지는 자체 포함되어야 합니다. 여기에는 다음을 포함하여 복구 모드를 부팅하는 데 필요한 모든 리소스가 포함되어야 합니다.
- 커널 이미지
- DTBO 이미지
-
lib/modules
의 커널 모듈 - 심볼릭 링크로서의 첫 번째 단계 초기화
/init -> /system/bin/init
- 2단계 초기화 바이너리
/system/bin/init
- 장치별
fstab
파일 -
recovery
바이너리 등을 포함한 기타 모든 복구 리소스 - 등.
이러한 장치에서 제품 구성은 generic_ramdisk.mk
에서 상속 됩니다.
BOARD 값 설정
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
바이너리 및 심볼릭 링크 초기화
recovery
램디스크에는 /init -> /system/bin/init
심볼릭 링크와 /system/bin/init
의 init_second_stage.recovery
가 포함되어야 합니다. 장치가 복구 모드로 부팅될 때 /system/bin/init
바이너리는 첫 번째 단계와 두 번째 단계 초기화를 모두 지원하는 데 필요합니다.
장치가 recovery
로 부팅될 때 recovery
램디스크의 내용은 다음과 같습니다.
-
/init -> /system/bin/init
(recovery
램디스크에서) -
/system/bin/init
(recovery
ramdisk에서,init_second_stage.recovery
에서 빌드,/init
에서 실행)
장치가 Android로 부팅될 때 vendor_boot
+ boot
ramdisks의 내용은 다음과 같습니다.
-
/init
(ramdisk에서,init_first_stage
에서 빌드)
fstab 파일 이동
boot
램디스크에 설치된 모든 fstab
파일을 vendor_ramdisk
및 recovery
램디스크로 이동합니다. 예를 들어 이 변경 사항 을 참조하십시오.
모듈 설치
원하는 경우 장치별 모듈을 vendor_ramdisk
및 recovery
램디스크에 설치할 수 있습니다(설치할 장치별 모듈이 없는 경우 이 단계 건너뛰기). init
는 루트를 전환하지 않습니다. 모듈의 vendor_ramdisk
변형은 vendor_ramdisk
의 루트에 설치됩니다. 모듈의 recovery
변형은 recovery
램디스크의 루트에 설치됩니다. vendor_ramdisk
및 recovery
ramdisk에 모듈을 설치하는 방법에 대한 예는 첫 번째 단계 콘솔 및 메타데이터 체크섬 을 참조하십시오.
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
에 설치됩니다.
첫 번째 단계 콘솔에 필요한 모듈(예: 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 \
메타데이터 체크섬
첫 번째 단계 마운트 동안 메타데이터 체크섬 을 지원하기 위해 GKI를 지원하지 않는 장치는 다음 모듈의 ramdisk 변형을 설치합니다. GKI에 대한 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
으로 이동하십시오.
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
복구의 첫 번째 단계 마운트 동안 메타데이터 체크섬을 지원하려면 이러한 모듈의 복구 변형을 활성화하고 설치합니다.
부팅 프로세스의 변경 사항
Android로 부팅할 때 부팅 프로세스는 변경되지 않습니다. vendor_boot
+ boot
ramdisk는 fstab
이 vendor_boot
에서 로드된다는 점을 제외하면 기존 부팅 프로세스와 유사합니다. system/bin/recovery
가 존재하지 않기 때문에 first_stage_init
는 이를 일반 부팅으로 처리합니다.
복구 모드로 부팅할 때 부팅 프로세스는 변경되지 않습니다. 복구 램디스크는 기존 복구 프로세스와 동일한 방식으로 로드됩니다. 커널은 recovery
이미지에서 로드됩니다. 복구 모드의 부팅 과정은 다음과 같습니다.
부트로더가 시작된 후 다음을 수행합니다.
- 복구 램디스크를
/
로 푸시합니다. -
recovery
파티션에서 커널을 실행합니다.
- 복구 램디스크를
커널은 ramdisk를
/
에 마운트한 다음recovery
ramdisk에서/system/bin/init
에 대한 심볼릭 링크인/init
를 실행합니다.첫 번째 단계 init가 시작된 후 다음을 수행합니다.
-
IsRecoveryMode() == true
및ForceNormalBoot() == false
를 설정합니다. -
/lib/modules
modules 에서 공급업체 커널 모듈을 로드합니다. -
DoFirstStageMount()
를 호출하지만IsRecoveryMode() == true
이므로 마운트를 건너뜁니다. (장치는 램디스크를 해제하지 않지만(/
이 여전히 동일하기 때문에)SetInitAvbVersionInRecovery()
를 호출합니다.) -
recovery
램디스크의/system/bin/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
파일이 일반boot
이미지 ramdisk에 추가됩니다. 이 파일에는 빌드의 타임스탬프 정보가 포함되어 있습니다.런타임 시 첫 번째 단계
init
는 램디스크를 해제하기 전에 램디스크에서tmpfs
로 파일을 복사 하여 두 번째 단계init
이 이 파일을 읽고boot
이미지 타임스탬프 속성을 설정할 수 있도록 합니다.