복구 이미지

비 A/B 기기에서는 복구 이미지에 기기 트리 blob(DTB) 또는 고급 구성 및 전원 인터페이스(ACPI) 오버레이 이미지의 정보가 포함되어야 합니다. 이러한 기기가 복구로 부팅될 때 부트로더는 복구 이미지와 호환되는 오버레이 이미지를 로드할 수 있습니다. A/B(원활한) 업데이트를 지원하는 기기는 복구를 별도의 복구 파티션 대신 부팅으로 사용해야 합니다(자세한 내용은 A/B 업데이트 구현 참고).

복구 DTBO/ACPIO를 부팅/복구 이미지의 일부로 포함하는 옵션은 Android 버전 간에 다릅니다.

버전 업데이트 체계 GKI 규정 준수 부팅 헤더 버전(출시 기기) 부팅 헤더 버전(업그레이드 기기) 전용 복구 이미지 필요
11 A/B,
가상 A/B
3* 해당 없음 아니요
A/B,
가상 A/B
아니요 2, 3 0, 1, 2, 3 아니요
비 A/B 3 해당 없음
비 A/B 아니요 2, 3 0, 1, 2, 3
10(Q) A/B 해당 없음 2 0, 1, 2 아니요
비 A/B 해당 없음 2 0, 1, 2
9(P) A/B 해당 없음 1 0, 1 아니요
비 A/B 해당 없음 1 0, 1
8(O) A/B 해당 없음 N/A(0으로 간주됨) N/A(0으로 간주됨) 아니요
비 A/B 해당 없음 N/A(0으로 간주됨) N/A(0으로 간주됨)

* Android 11 이상을 실행하고 일반 커널 이미지(GKI)를 사용하는 A/B 기기는 공급업체 부팅 파티션과 호환되도록 기본 부팅 헤더 버전 3을 사용해야 합니다.

핵심사항

  • A/B 기기는 복구 이미지를 지정하지 않아도 됩니다. A/B 업데이트에서 두 세트의 파티션(bootdtbo 포함)을 사용하고 업데이트 중에 파티션 간에 전환하기 때문에 복구 이미지가 필요하지 않습니다. 원하는 경우 A/B 기기에서 전용 복구 이미지를 계속 사용할 수 있습니다.

  • Android 11 이상으로 출시되고 부팅 헤더 버전 3을 사용하는 비 A/B 기기는 별도로 복구 이미지에 부팅 헤더 버전 2를 명시적으로 지정해야 합니다. 예를 들면 다음과 같습니다.

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • 기기 트리를 지원하지 않는 아키텍처의 경우 복구 이미지에는 DTBO 이미지 대신 ACPIO 이미지가 포함될 수 있습니다.

OTA 실패 및 복구 이미지 관련 안내

비 A/B 기기의 무선 업데이트(OTA) 실패를 방지하려면 복구 이미지는 독립적이고 다른 이미지와 상관없어야 합니다. OTA 업데이트 도중 오버레이 이미지가 업데이트되었지만 업데이트가 완전히 완료되기 전에 문제가 발생하면 기기는 OTA 업데이트를 완료하기 위해 복구 모드로 부팅을 시도합니다. 그러나 오버레이 파티션이 이미 업데이트되었으므로 아직 업데이트되지 않은 복구 이미지와의 불일치가 발생할 수 있습니다.

업데이트 중에 복구가 DTBO/ACPIO 파티션에 의존하는 것을 방지하려면, Android 9 이상을 실행하는 비 A/B 기기가 오버레이 이미지의 정보가 포함된 복구 DTBO/ACPIO 이미지를 부팅 이미지 형식의 별도 섹션으로 지정하면 됩니다(부팅 헤더 버전 1이나 2를 사용해야 함).

부팅 이미지 변경사항

Android 9 이상을 실행하는 비 A/B 기기에서 복구 DTBO 또는 ACPIO를 복구 이미지에 포함하도록 하려면 부팅 이미지 구조를 다음과 같이 업데이트하세요.

부팅 이미지 섹션 페이지 수
부팅 헤더(1페이지) 1
커널(l페이지) l = (kernel_size + page_size - 1) / page_size
램디스크(m페이지) m = (ramdisk_size + page_size - 1) / page_size
2단계 부트로더(n페이지) n = (second_size + page_size - 1) / page_size
복구 DTBO 또는 ACPIO(o페이지) o = (recovery_[dtbo|acpio]_size + page_size - 1) / page_size

부팅 이미지 헤더 버전과 오버레이 이미지 경로를 지정하는 mkbootimg 도구 인수에 관한 자세한 내용은 부팅 이미지 헤더 버전 관리를 참고하세요.

DTBO 구현

9 이상을 실행하는 비 A/B 기기는 복구 이미지의 recovery_dtbo 섹션을 채울 수 있습니다. recovery_dtbo 이미지를 recovery.img에 포함하려면 기기의 BoardConfig.mk에서 다음과 같이 처리합니다.

  • BOARD_INCLUDE_RECOVERY_DTBO 구성을 true로 설정합니다.

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • BOARD_MKBOOTIMG_ARGS 변수를 확장하여 부팅 이미지 헤더 버전을 지정합니다.

    BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • BOARD_PREBUILT_DTBOIMAGE 변수를 DTBO 이미지 경로로 설정합니다. Android 빌드 시스템은 복구 이미지 생성 중에 이 변수를 사용하여 mkbootimg 도구의 recovery_dtbo 인수를 설정합니다.

변수 BOARD_INCLUDE_RECOVERY_DTBO, BOARD_MKBOOTIMG_ARGS, BOARD_PREBUILT_DTBOIMAGE를 올바르게 설정하면 Android 빌드 시스템에는 recovery.imgBOARD_PREBUILT_DTBOIMAGE 변수로 지정된 DTBO가 포함됩니다.

ACPIO 구현

Android 9 이상을 실행하는 비 A/B 기기는 DTBO 이미지 대신 ACPIO 오버레이 이미지를 사용할 수 있고 복구 이미지의 recovery_dtbo 섹션 대신 recovery_acpio 섹션을 채울 수 있습니다. recovery_acpio 이미지를 recovery.img에 포함하려면 기기의 BoardConfig.mk에서 다음과 같이 처리합니다.

  • BOARD_INCLUDE_RECOVERY_ACPIO 구성을 true로 설정합니다.

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • BOARD_MKBOOTIMG_ARGS 변수를 확장하여 부팅 이미지 헤더 버전을 지정합니다. 복구 ACPIO를 지원하려면 변수가 1 이상이어야 합니다.

    BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
    
  • BOARD_RECOVERY_ACPIO 변수를 ACPIO 이미지 경로로 설정합니다. Android 빌드 시스템은 복구 이미지 생성 중에 이 변수를 사용하여 mkbootimg 도구의 recovery_acpio 인수를 설정합니다.

변수 BOARD_INCLUDE_RECOVERY_ACPIO, BOARD_MKBOOTIMG_ARGS, BOARD_RECOVERY_ACPIO를 올바르게 설정하면 Android 빌드 시스템에는 recovery.imgBOARD_RECOVERY_ACPIO 변수로 지정된 ACPIO가 포함됩니다.