일반 부팅 파티션

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Android 12에서 GKI(일반 커널 이미지 )라고 하는 일반 boot 이미지에는 일반 램디스크와 GKI 커널이 포함됩니다.

Android 13으로 실행되는 기기의 경우 일반 램디스크가 boot 이미지에서 제거되고 별도의 init_boot 이미지에 배치됩니다. 이 변경으로 인해 boot 이미지에는 GKI 커널만 남게 됩니다.

Android 12 또는 이전 커널 버전을 계속 사용하는 기기를 업그레이드하는 경우 일반 ramdisk는 새 init_boot 이미지에 대한 요구 사항 없이 그대로 유지됩니다.

일반 램디스크를 빌드하려면 일반 램디스크에 1단계 init 및 타임스탬프 정보가 포함된 속성 파일만 포함되도록 램디스크에서 공급업체별 리소스를 이동합니다.

다음과 같은 기기에서:

  • 전용 recovery 파티션을 사용하지 마십시오. 모든 복구 비트는 일반 램디스크에서 vendor_boot 램디스크로 이동합니다.

  • 전용 recovery 파티션을 사용하십시오. recovery 램디스크는 자체 포함되어 있으므로 recovery 램디스크를 변경할 필요가 없습니다.

건축물

다음 다이어그램은 Android 12 이상을 실행하는 기기의 아키텍처를 보여줍니다. Android 13으로 시작하는 기기에는 일반 램디스크가 포함된 새로운 init_boot 이미지가 있습니다. Android 12에서 Android 13으로 업그레이드하는 기기는 Android 12에서와 동일한 아키텍처를 사용합니다.

Android 13으로 시작, 전용 복구 없음

시작/업그레이드 장치, GKI, 전용 복구 없음

그림 1. 전용 복구가 없는 GKI를 사용하여 Android 13을 시작하거나 업그레이드하는 기기

Android 13으로 시작, 전용 및 A/B 복구(전용 ramdisk)

출시/업그레이드 장치, GKI, 전용 및 A/B 복구

그림 2. GKI, 전용 및 A/B 복구를 사용하여 Android 13을 시작하거나 업그레이드하는 기기

장치에 recovery_arecovery_b 파티션이 있는 경우 이 그림을 참조하십시오.

Android 13으로 출시, 전용 및 비 A/B 복구(전용 램디스크)

시작/업그레이드 장치, GKI, 전용 및 비 A/B 복구

그림 3. GKI, 전용 및 비 A/B 복구를 사용하여 Android 13을 시작하거나 업그레이드하는 기기

장치에 슬롯 접미사가 없는 recovery 라는 파티션이 있는 경우 이 그림을 참조하십시오.

Android 12 실행 또는 업그레이드, 전용 복구 없음

시작/업그레이드 장치, GKI, 전용 복구 없음

그림 4. 전용 복구가 없는 GKI를 사용하여 Android 12를 시작하거나 업그레이드하는 기기

Android 12, 전용 및 A/B 복구 실행 또는 업그레이드(전용 ramdisk)

출시/업그레이드 장치, GKI, 전용 및 A/B 복구

그림 5. GKI, 전용 및 A/B 복구를 사용하여 Android 12를 시작하거나 업그레이드하는 기기

장치에 recovery_arecovery_b 파티션이 있는 경우 이 그림을 참조하십시오.

Android 12 실행 또는 업그레이드, 전용 및 비 A/B 복구(전용 ramdisk)

시작/업그레이드 장치, GKI, 전용 및 비 A/B 복구

그림 6. GKI, 전용 및 비 A/B 복구를 사용하여 Android 12로 시작하거나 업그레이드하는 기기

장치에 슬롯 접미사가 없는 recovery 라는 파티션이 있는 경우 이 그림을 참조하십시오.

Android 12로 업그레이드, 부팅 시 복구(ramdisk로 복구)

장치 시작/업그레이드, GKI 없음, 부팅 시 복구

그림 7. Android 12로 업그레이드하는 기기(GKI 없음, 부팅 시 복구)

Android 12로 업그레이드, 전용 복구(전용 ramdisk)

장치 실행/업그레이드, GKI 없음, 전용 복구

그림 8. Android 12로 업그레이드하는 기기, GKI 없음, 전용 복구

부팅 이미지 콘텐츠

Android 부팅 이미지에는 다음이 포함됩니다.

  • Android 13으로 시작하는 기기에 init_boot 이미지가 추가되었습니다.

    • 헤더 버전 V4
    • 일반 램디스크 이미지
  • 일반 boot 이미지

    • 헤더 버전 V3 또는 V4
      • GKI boot.img 인증을 위한 boot_signature (v4 전용). 인증된 GKI boot.img 는 검증된 부팅을 위해 서명되지 않았습니다. OEM은 여전히 ​​장치별 AVB 키로 사전 빌드된 boot.img 에 서명해야 합니다.
      • 일반 cmdline ( GENERIC_KERNEL_CMDLINE )
      • GKI 커널
    • 일반 램디스크 이미지
      • Android 12 및 이전 버전의 boot 이미지에만 포함됨
  • vendor_boot 이미지(자세한 내용은 공급업체 부팅 파티션 참조)

    • vendor_boot 헤더
      • 기기별 cmdline ( BOARD_KERNEL_CMDLINE )
    • vendor_boot 램디스크 이미지
      • lib/modules
      • 복구 리소스(전용 복구가 없는 경우)
    • dtb 이미지
  • recovery 이미지

    • 헤더 버전 V2
      • 필요한 경우 복구를 위한 장치별 cmdline
      • 비 A/B 복구 파티션의 경우 헤더 내용은 독립 실행형이어야 합니다. 복구 이미지 를 참조하십시오. 예를 들어:
      • cmdlinebootvendor_boot cmdline 에 연결되지 않습니다.
      • 헤더는 필요한 경우 복구 DTBO를 지정합니다.
      • A/B 복구 파티션의 경우 bootvendor_boot 에서 내용을 연결하거나 유추할 수 있습니다. 예를 들어:
      • cmdlinebootvendor_boot cmdline 에 연결됩니다.
      • DTBO는 vendor_boot 헤더에서 유추될 수 있습니다.
    • recovery 램디스크 이미지
      • 복구 리소스
      • 비 A/B 복구 파티션의 경우 ramdisk의 내용은 독립 실행형이어야 합니다. 복구 이미지 를 참조하십시오. 예를 들어:
      • lib/modules 는 복구 모드를 부팅하는 데 필요한 모든 커널 모듈을 포함해야 합니다.
      • 복구 램디스크에는 init 가 포함되어야 합니다.
      • A/B 복구 파티션의 경우 복구 램디스크가 일반 및 vendor_boot 램디스크 앞에 추가되므로 독립 실행형일 필요가 없습니다. 예를 들어:
      • lib/modules 에는 vendor_boot ramdisk의 커널 모듈 외에 복구 모드를 부팅하는 데 필요한 추가 커널 모듈만 포함될 수 있습니다.
      • /init 에 심볼릭 링크가 있을 수 있지만 부팅 이미지의 첫 번째 단계 /init 바이너리에 의해 가려집니다.

일반 램디스크 이미지 콘텐츠

일반 램디스크에는 다음 구성 요소가 포함되어 있습니다.

  • 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 , recoveryvendor_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 . 이 변수는 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/B recovery 파티션을 사용하는 기기는 이 변수를 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 생성 여부를 제어하고 크기를 설정합니다. 설정하면 일반 ramdisk가 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_IMAGEtrue 또는 비어 있도록 설정할 수 있습니다. 이러한 장치의 경우 BOARD_RECOVERYIMAGE_PARTITION_SIZE 가 설정되면 recovery 이미지가 빌드됩니다.

부팅을 위해 연결된 vbmeta 사용

bootinit_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

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

예를 들어 이 변경 사항 을 참조하십시오.

루트로서의 시스템

GKI를 사용하는 장치에는 루트로서의 시스템이 지원되지 않습니다. 이러한 장치에서 BOARD_BUILD_SYSTEM_ROOT_IMAGE 는 비어 있어야 합니다. 루트로서의 시스템은 동적 파티션을 사용하는 장치에서도 지원되지 않습니다.

제품 구성

일반 램디스크를 사용하는 장치는 램디스크에 설치할 수 있는 파일 목록을 설치해야 합니다. 이렇게 하려면 device.mk 에서 다음을 지정합니다.

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)

또한 generic_ramdisk.mk 파일은 다른 makefile이 실수로 다른 파일을 ramdisk에 설치하는 것을 방지합니다(이러한 파일을 대신 vendor_ramdisk 로 이동).

장치 설정

설정 지침은 Android 13으로 시작하는 기기, Android 12로 업그레이드하는 기기, Android 12로 시작하는 기기에 따라 다릅니다. Android 13은 Android 12에서와 유사하게 설정됩니다.

  • Android 12로 업그레이드하는 기기:

    • BOARD_USES_RECOVERY_AS_BOOT 값을 유지할 수 있습니다. 그렇게 하는 경우 레거시 구성을 사용하고 있으며 새 빌드 변수는 비어 있어야 합니다. 그러한 장치의 경우:

      • BOARD_USES_RECOVERY_AS_BOOTtrue 로 설정합니다. 아키텍처는 그림 3 과 같습니다.

      • BOARD_USES_RECOVERY_AS_BOOT 를 공백으로 설정합니다. 아키텍처는 그림 4 와 같습니다.

    • BOARD_USES_RECOVERY_AS_BOOT 를 공백으로 설정할 수 있습니다. 그렇게 하면 새로운 구성을 사용하는 것입니다. 그러한 장치의 경우:

      • 전용 recovery 파티션을 사용하지 마십시오. 아키텍처는 그림 1 과 같으며 장치 설정 옵션은 옵션 1 입니다.

      • 전용 recovery 파티션을 사용합니다. 아키텍처는 그림 2a 또는 그림 2b 와 같으며 장치 설정 옵션은 옵션 2a 또는 옵션 2b 입니다.

  • Android 12로 출시되는 기기는 BOARD_USES_RECOVERY_AS_BOOT 를 비우도록 설정하고 새 구성을 사용해야 합니다. 그러한 장치의 경우:

    • 전용 recovery 파티션을 사용하지 마십시오. 아키텍처는 그림 1 과 같으며 장치 설정 옵션은 옵션 1 입니다.

    • 전용 recovery 파티션을 사용합니다. 아키텍처는 그림 2a 또는 그림 2b 와 같으며 장치 설정 옵션은 옵션 2a 또는 옵션 2b 입니다.

aosp_arm64 는 GKI만 빌드하기 때문에( 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 포함할 수 있습니다. 그러나 일반 램디스크가 vendor_boot 램디스크 이후에 연결되기 때문에 /init 심볼릭 링크를 덮어씁니다. 장치가 복구로 부팅될 때 /system/bin/init 바이너리는 두 번째 단계 초기화를 지원하는 데 필요합니다. vendor_boot + 일반 램디스크의 내용은 다음과 같습니다.

  • /init ( init_first_stage 에서 빌드된 일반 램디스크에서)
  • /system/bin/init ( vendor_ramdisk 에서 빌드된 init_second_stage.recovery 에서)

fstab 파일 이동

일반 ramdisk에 설치된 모든 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 , shtoybox$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 \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

예를 들어 이 변경 목록 을 참조하십시오.

가상 A/B 압축

가상 A/B 압축을 지원하려면 snapuserdvendor_ramdisk 에 설치해야 합니다. 장치는 snapuserdvendor_ramdisk 변형을 설치하는 virtual_ab_ota/compression.mk 에서 상속해야 합니다.

부팅 프로세스의 변경 사항

복구 또는 Android로 부팅하는 프로세스는 다음을 제외하고 변경되지 않습니다.

  • Ramdisk build.prop/second_stage_resources 로 이동하여 두 번째 단계 init 가 부팅의 빌드 타임스탬프를 읽을 수 있도록 합니다.

리소스가 일반 램디스크에서 vendor_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_arecovery_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/initinit_second_stage.recovery 를 포함할 수 있습니다. 그러나 부팅 램디스크는 recovery 램디스크 이후에 연결되기 때문에 /init 심볼릭 링크를 덮어씁니다. 장치가 복구 모드로 부팅되면 두 번째 단계 초기화를 지원하기 위해 /system/bin/init 바이너리가 필요합니다.

장치가 recovery 로 부팅될 때 recovery + vendor_boot + 일반 ramdisks의 내용은 다음과 같습니다.

  • /init (ramdisk에서, init_first_stage 에서 빌드)
  • /system/bin/init ( recovery ramdisk에서, init_second_stage.recovery 에서 빌드, /init 에서 실행)

장치가 Android로 부팅될 때 vendor_boot + 일반 ramdisks의 내용은 다음과 같습니다.

  • /init ( init_first_stage 에서 빌드된 일반 램디스크에서)

fstab 파일 이동

일반 ramdisk에 설치된 모든 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 , shtoybox$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 \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

예를 들어 이 변경 목록 을 참조하십시오.

가상 A/B 압축

가상 A/B 압축을 지원하려면 snapuserdvendor_ramdisk 에 설치해야 합니다. 장치는 snapuserdvendor_ramdisk 변형을 설치하는 virtual_ab_ota/compression.mk 에서 상속해야 합니다.

부팅 프로세스의 변경 사항

Android로 부팅할 때 부팅 프로세스는 변경되지 않습니다. vendor_boot + 일반 ramdisk는 fstabvendor_boot 에서 로드된다는 점을 제외하고 기존 부팅 프로세스와 유사합니다. system/bin/recovery 가 존재하지 않기 때문에 first_stage_init 는 이를 일반 부팅으로 처리합니다.

복구 모드로 부팅하면 부팅 프로세스가 변경됩니다. Recovery + vendor_boot + 일반 ramdisk는 기존 복구 프로세스와 유사하지만 커널이 recovery 이미지가 아닌 boot 이미지에서 로드됩니다. 복구 모드의 부팅 과정은 다음과 같습니다.

  1. 부트로더가 시작된 후 다음을 수행합니다.

    1. Recovery + vendor_boot + 일반 램디스크를 / 로 푸시합니다. (OEM이 BOARD_RECOVERY_KERNEL_MODULES 에 추가하여 복구 램디스크에 커널 모듈을 복제하는 경우, vendor_boot 는 선택 사항입니다.)
    2. boot 파티션에서 커널을 실행합니다.
  2. 커널은 ramdisk를 / 에 마운트한 다음 일반 ramdisk에서 /init 를 실행합니다.

  3. 첫 번째 단계 init가 시작된 후 다음을 수행합니다.

    1. IsRecoveryMode() == trueForceNormalBoot() == false 를 설정합니다.
    2. /lib/modules modules 에서 공급업체 커널 모듈을 로드합니다.
    3. DoFirstStageMount() 를 호출하지만 IsRecoveryMode() == true 이므로 마운트를 건너뜁니다. (장치는 램디스크를 해제하지 않지만( / 이 여전히 동일하기 때문에) SetInitAvbVersionInRecovery() 를 호출합니다.)
    4. recovery 램디스크의 /system/bin/init 에서 두 번째 단계 초기화를 시작합니다.

e2fsck를 사용 가능하게 만들기

장치 makefile은 다음에서 상속할 수 있습니다.

  • 장치가 가상 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/initinit_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 + 일반 ramdisks의 내용은 다음과 같습니다.

  • /init (ramdisk에서, init_first_stage 에서 빌드)

fstab 파일 이동

일반 ramdisk에 설치된 모든 fstab 파일을 vendor_ramdiskrecovery ramdisk로 이동합니다. 예를 들어 이 변경 사항 을 참조하십시오.

모듈 설치

원하는 경우 장치별 모듈을 vendor_ramdiskrecovery 램디스크에 설치할 수 있습니다(설치할 장치별 모듈이 없는 경우 이 단계 건너뛰기). init 는 루트를 전환하지 않습니다. 모듈의 vendor_ramdisk 변형은 vendor_ramdisk 의 루트에 설치됩니다. 모듈의 recovery 변형은 recovery 램디스크의 루트에 설치됩니다. vendor_ramdiskrecovery ramdisk에 모듈을 설치하는 방법에 대한 예는 첫 번째 단계 콘솔메타데이터 체크섬 을 참조하십시오.

1단계 콘솔

모듈의 vendor_ramdisk 변형을 설치하려면 다음을 사용하십시오.

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

이렇게 하면 linker , shtoybox$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_ramdiskrecovery 로 바꾸십시오.

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 \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

복구의 첫 번째 단계 마운트 동안 메타데이터 체크섬을 지원하려면 이러한 모듈의 복구 변형을 활성화하고 설치합니다.

부팅 프로세스의 변경 사항

Android로 부팅할 때 부팅 프로세스는 변경되지 않습니다. vendor_boot + 일반 ramdisk는 fstabvendor_boot 에서 로드된다는 점을 제외하고 기존 부팅 프로세스와 유사합니다. system/bin/recovery 가 존재하지 않기 때문에 first_stage_init 는 이를 일반 부팅으로 처리합니다.

복구 모드로 부팅할 때 부팅 프로세스는 변경되지 않습니다. 복구 램디스크는 기존 복구 프로세스와 동일한 방식으로 로드됩니다. 커널은 recovery 이미지에서 로드됩니다. 복구 모드의 부팅 과정은 다음과 같습니다.

  1. 부트로더가 시작된 후 다음을 수행합니다.

    1. 복구 램디스크를 / 로 푸시합니다.
    2. recovery 파티션에서 커널을 실행합니다.
  2. 커널은 ramdisk를 / 에 마운트한 다음 recovery ramdisk에서 /system/bin/init 에 대한 심볼릭 링크인 /init 를 실행합니다.

  3. 첫 번째 단계 init가 시작된 후 다음을 수행합니다.

    1. IsRecoveryMode() == trueForceNormalBoot() == false 를 설정합니다.
    2. /lib/modules modules 에서 공급업체 커널 모듈을 로드합니다.
    3. DoFirstStageMount() 를 호출하지만 IsRecoveryMode() == true 이므로 마운트를 건너뜁니다. (장치는 램디스크를 해제하지 않지만( / 이 여전히 동일하기 때문에) SetInitAvbVersionInRecovery() 를 호출합니다.)
    4. 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 파일이 일반 ramdisk에 추가됩니다. 이 파일에는 빌드의 타임스탬프 정보가 포함되어 있습니다.

  • 런타임 시 첫 번째 단계 init 는 램디스크를 해제하기 전에 램디스크에서 tmpfs 로 파일을 복사 하여 두 번째 단계 init 이 이 파일을 읽고 boot 이미지 타임스탬프 속성을 설정할 수 있도록 합니다.