2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
복구 이미지
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
비 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 업데이트에서 두 세트의 파티션(boot
및 dtbo
포함)을 사용하고 업데이트 중에 파티션 간에 전환하기 때문에 복구 이미지가 필요하지 않습니다. 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.img
의 BOARD_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.img
의 BOARD_RECOVERY_ACPIO
변수로 지정된 ACPIO가 포함됩니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Recovery images\n\nOn non-A/B devices, the recovery image should contain information from a\n[device tree blob (DTB)](/docs/core/architecture/bootloader/dtb-images) or\n[Advanced Configuration and Power Interface\n(ACPI)](https://uefi.org/acpi/specs) overlay image. When such\ndevices boot into recovery, the bootloader can then load the overlay image that\nis compatible with the recovery image. Devices that support [A/B (seamless)\nupdates](/docs/core/ota/ab) should use recovery as boot instead of a\nseparate recovery partition (for details, see [Implementing A/B\nUpdates](/docs/core/ota/ab/ab_implement)).\n\nThe options for including a recovery DTBO/ACPIO as part of the boot/recovery\nimage differ between Android releases.\n\n| Release | Update scheme | GKI compliance | Boot header version (launching devices) | Boot header version (upgrading devices) | Dedicated recovery image required |\n|---------|------------------|----------------|-----------------------------------------|-----------------------------------------|-----------------------------------|\n| 11 | A/B, Virtual A/B | Yes | 3^\\*^ | N/A | No |\n| 11 | A/B, Virtual A/B | No | 2, 3 | 0, 1, 2, 3 | No |\n| 11 | non-A/B | Yes | 3 | N/A | Yes |\n| 11 | non-A/B | No | 2, 3 | 0, 1, 2, 3 | Yes |\n| 10 (Q) | A/B | N/A | 2 | 0, 1, 2 | No |\n| 10 (Q) | non-A/B | N/A | 2 | 0, 1, 2 | Yes |\n| 9 (P) | A/B | N/A | 1 | 0, 1 | No |\n| 9 (P) | non-A/B | N/A | 1 | 0, 1 | Yes |\n| 8 (O) | A/B | N/A | N/A (considered 0) | N/A (considered 0) | No |\n| 8 (O) | non-A/B | N/A | N/A (considered 0) | N/A (considered 0) | Yes |\n\n**\\*** *A/B devices running Android\n11 or higher and using the [Generic Kernel Image\n(GKI)](/docs/core/architecture/kernel/generic-kernel-image) must use a\nprimary [boot header version of\n3](/docs/core/architecture/bootloader/boot-image-header#header-v3) to be\ncompatible with the [vendor boot\npartition](/docs/core/architecture/bootloader/partitions/vendor-boot-partitions).*\n\nKey points:\n\n- A/B devices don't need to specify a recovery image as A/B updates use two sets\n of partitions (including `boot` and `dtbo`) and switch between them during\n updates, removing the need for a recovery image. A/B devices can\n still use a dedicated recovery image.\n\n- Non-A/B devices launching with Android 11 or higher\n and using a boot header version of 3 must explicitly specify a [boot header\n version of 2](/docs/core/architecture/bootloader/boot-image-header#header-v2)\n for the recovery image separately. For example:\n\n BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2\n\n- For architectures that don't support device trees, the recovery image can\n include an ACPIO image instead of a DTBO image.\n\nAbout OTA failures and recovery images\n--------------------------------------\n\nTo prevent over-the-air (OTA) failures on non-A/B devices, the recovery image\nshould be self-sufficient and independent of other images. During an OTA update,\nif a problem occurs after the overlay image has been updated (but prior to\ncompleting the full update), the device tries to boot into recovery mode to\ncomplete the OTA update. However, because the overlay partition has already been\nupdated, a mismatch could occur with the recovery image (which hasn't been\nupdated yet).\n\nTo prevent recovery from depending on the DTBO/ACPIO partition during an\nupdate, non-A/B devices running Android 9 or higher\ncan specify a recovery DTBO/ACPIO image containing information from the overlay\nimage as a separate section in the boot image format (must use a boot header\nversion of 1 or 2).\n\nBoot image changes\n------------------\n\nTo allow the recovery image to contain the recovery DTBO or ACPIO on non-A/B\ndevices running Android 9 or higher, update the boot\nimage structure as follows.\n\n| Boot image section | Number of pages |\n|-----------------------------------|--------------------------------------------------------------------|\n| Boot header (1 page) | 1 |\n| Kernel (l pages) | l = (`kernel_size` + `page_size` - 1) / `page_size` |\n| Ramdisk (m pages) | m = (`ramdisk_size` + `page_size` - 1) / `page_size` |\n| Second stage bootloader (n pages) | n = (`second_size` + `page_size` - 1) / `page_size` |\n| Recovery DTBO or ACPIO (o pages) | o = (`recovery_[dtbo|acpio]_size` + `page_size` - 1) / `page_size` |\n\nFor details on the `mkbootimg` tool arguments for specifying the boot image\nheader version and overlay image paths, see [Boot Image Header\nVersioning](/docs/core/architecture/bootloader/boot-image-header#implementing-versioning).\n\nImplement DTBO\n--------------\n\nNon-A/B devices running 9 or higher can populate the\n`recovery_dtbo` section of the recovery image. To include the `recovery_dtbo`\nimage in `recovery.img`, in the device `BoardConfig.mk`:\n\n- Set the config `BOARD_INCLUDE_RECOVERY_DTBO` to `true`:\n\n BOARD_INCLUDE_RECOVERY_DTBO := true\n\n- Extend the `BOARD_MKBOOTIMG_ARGS` variable to specify the boot image header\n version:\n\n BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)\n\n- Ensure that the `BOARD_PREBUILT_DTBOIMAGE` variable is set to the path of the\n DTBO image. The Android build system uses the variable to set the\n `recovery_dtbo` argument of the `mkbootimg` tool during the creation of\n recovery image.\n\nIf the `BOARD_INCLUDE_RECOVERY_DTBO`, `BOARD_MKBOOTIMG_ARGS`, and\n`BOARD_PREBUILT_DTBOIMAGE` variables are set correctly, the Android build system\nincludes the DTBO specified by the `BOARD_PREBUILT_DTBOIMAGE` variable in\n`recovery.img`.\n\nImplement ACPIO\n---------------\n\nNon-A/B devices running Android 9 or higher can use\nan ACPIO overlay image (instead of a DTBO image) and can populate the\n`recovery_acpio` section (instead of the `recovery_dtbo` section) of the\nrecovery image. To include the `recovery_acpio` image in `recovery.img`, in the\ndevice `BoardConfig.mk`:\n\n- Set the config `BOARD_INCLUDE_RECOVERY_ACPIO` to `true`:\n\n BOARD_INCLUDE_RECOVERY_ACPIO := true\n\n- Extend the `BOARD_MKBOOTIMG_ARGS` variable to specify the boot image header\n version. The variable must be greater than or equal to 1 to support recovery\n ACPIO.\n\n BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)\n\n- Ensure that the `BOARD_RECOVERY_ACPIO` variable is set to the path of the\n ACPIO image. The Android build system uses the variable to set the\n `recovery_acpio` argument of the `mkbootimg` tool during the creation of the\n recovery image.\n\nIf the `BOARD_INCLUDE_RECOVERY_ACPIO`, `BOARD_MKBOOTIMG_ARGS`, and\n`BOARD_RECOVERY_ACPIO` variables are set correctly, the Android build system\nincludes the ACPIO specified by the `BOARD_RECOVERY_ACPIO` variable in\n`recovery.img`."]]