En los dispositivos que no son A/B, la imagen de recuperación debe contener información de un blob de árbol de dispositivos (DTB) o una imagen superpuesta de interfaz de alimentación y configuración avanzada (ACPI) . Cuando tales dispositivos inician la recuperación, el gestor de arranque puede cargar la imagen de superposición que es compatible con la imagen de recuperación. Los dispositivos que admiten actualizaciones A/B (continuas) deben usar la recuperación como arranque en lugar de una partición de recuperación separada (para obtener detalles, consulte Implementación de actualizaciones A/B ).
Las opciones para incluir un DTBO/ACPIO de recuperación como parte de la imagen de arranque/recuperación difieren entre las versiones de Android.
Liberar | Esquema de actualización | Cumplimiento de GKI | Versión del encabezado de arranque (dispositivos de lanzamiento) | Versión del encabezado de arranque (dispositivos de actualización) | Se requiere una imagen de recuperación dedicada |
---|---|---|---|---|---|
11 | A/B, A/B virtuales | sí | 3 * | N / A | No |
A/B, A/B virtuales | No | 2, 3 | 0, 1, 2, 3 | No | |
no-A/B | sí | 3 | N / A | sí | |
no-A/B | No | 2, 3 | 0, 1, 2, 3 | sí | |
10 (Q) | A/B | N / A | 2 | 0, 1, 2 | No |
no-A/B | N / A | 2 | 0, 1, 2 | sí | |
9 (P) | A/B | N / A | 1 | 0, 1 | No |
no-A/B | N / A | 1 | 0, 1 | sí | |
8 (O) | A/B | N / A | N/A (considerado 0) | N/A (considerado 0) | No |
no-A/B | N / A | N/A (considerado 0) | N/A (considerado 0) | sí |
* Los dispositivos A/B que ejecutan Android 11 o superior y usan la imagen genérica del kernel (GKI) deben usar una versión de encabezado de arranque principal de 3 para ser compatibles con la partición de arranque del proveedor .
Puntos clave:
Los dispositivos A/B no necesitan especificar una imagen de recuperación, ya que las actualizaciones A/B usan dos conjuntos de particiones (que incluyen
boot
ydtbo
) y cambian entre ellas durante las actualizaciones, lo que elimina la necesidad de una imagen de recuperación. Si lo desea, los dispositivos A/B aún pueden usar una imagen de recuperación dedicada.Los dispositivos que no sean A/B que se inicien con Android 11 o superior y usen una versión de encabezado de arranque de 3 deben especificar explícitamente una versión de encabezado de arranque de 2 para la imagen de recuperación por separado. Por ejemplo:
BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
Para las arquitecturas que no admiten árboles de dispositivos, la imagen de recuperación puede incluir una imagen ACPIO en lugar de una imagen DTBO.
Acerca de las fallas de OTA y las imágenes de recuperación
Para evitar fallas por aire (OTA) en dispositivos que no sean A/B, la imagen de recuperación debe ser autosuficiente e independiente de otras imágenes. Durante una actualización OTA, si ocurre un problema después de que se haya actualizado la imagen superpuesta (pero antes de completar la actualización completa), el dispositivo intenta iniciarse en modo de recuperación para completar la actualización OTA. Sin embargo, debido a que la partición superpuesta ya se actualizó, podría producirse una discrepancia con la imagen de recuperación (que aún no se ha actualizado).
Para evitar que la recuperación dependa de la partición DTBO/ACPIO durante una actualización, los dispositivos que no sean A/B que ejecuten Android 9 o superior pueden especificar una imagen DTBO/ACPIO de recuperación que contenga información de la imagen superpuesta como una sección separada en el formato de imagen de arranque ( debe usar una versión de encabezado de arranque de 1 o 2).
Cambios en la imagen de arranque
Para permitir que la imagen de recuperación contenga el DTBO o ACPIO de recuperación en dispositivos no A/B que ejecutan Android 9 o superior, actualice la estructura de la imagen de arranque de la siguiente manera.
Sección de imagen de arranque | Número de páginas |
---|---|
Encabezado de arranque (1 página) | 1 |
Núcleo (l páginas) | l = ( kernel_size + page_size - 1) / page_size |
Ramdisk (m páginas) | m = ( ramdisk_size + page_size - 1) / page_size |
Cargador de arranque de segunda etapa (n páginas) | n = ( second_size + page_size - 1) / page_size |
Recuperación DTBO o ACPIO (o páginas) | o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size |
Para obtener detalles sobre los argumentos de la herramienta mkbootimg
para especificar la versión del encabezado de la imagen de arranque y las rutas de la imagen de superposición, consulte Control de versiones del encabezado de la imagen de arranque .
Implementando DTBO
Los dispositivos que no son A/B que ejecutan 9 o superior pueden completar la sección recovery_dtbo
de la imagen de recuperación. Para incluir la imagen recovery_dtbo
en recovery.img
, en el dispositivo BoardConfig.mk
:
Establezca la configuración
BOARD_INCLUDE_RECOVERY_DTBO
entrue
:BOARD_INCLUDE_RECOVERY_DTBO := true
Extienda la variable
BOARD_MKBOOTIMG_ARGS
para especificar la versión del encabezado de la imagen de arranque:BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Asegúrese de que la variable
BOARD_PREBUILT_DTBOIMAGE
esté establecida en la ruta de la imagen DTBO. El sistema de compilación de Android usa la variable para establecer el argumentorecovery_dtbo
de la herramientamkbootimg
durante la creación de la imagen de recuperación.
Si las BOARD_INCLUDE_RECOVERY_DTBO
, BOARD_MKBOOTIMG_ARGS
y BOARD_PREBUILT_DTBOIMAGE
están configuradas correctamente, el sistema de compilación de Android incluye el DTBO especificado por la variable BOARD_PREBUILT_DTBOIMAGE
en recovery.img
.
Implementando ACPIO
Los dispositivos que no son A/B con Android 9 o superior pueden usar una imagen de superposición ACPIO (en lugar de una imagen DTBO) y pueden completar la sección recovery_acpio
(en lugar de la sección recovery_dtbo
) de la imagen de recuperación. Para incluir la imagen recovery_acpio
en recovery.img
, en el dispositivo BoardConfig.mk
:
Establezca la configuración
BOARD_INCLUDE_RECOVERY_ACPIO
entrue
:BOARD_INCLUDE_RECOVERY_ACPIO := true
Extienda la variable
BOARD_MKBOOTIMG_ARGS
para especificar la versión del encabezado de la imagen de arranque. La variable debe ser mayor o igual a 1 para admitir la recuperación ACPIO.BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Asegúrese de que la variable
BOARD_RECOVERY_ACPIO
esté configurada en la ruta de la imagen ACPIO. El sistema de compilación de Android usa la variable para establecer el argumentorecovery_acpio
de la herramientamkbootimg
durante la creación de la imagen de recuperación.
Si las BOARD_INCLUDE_RECOVERY_ACPIO
, BOARD_MKBOOTIMG_ARGS
y BOARD_RECOVERY_ACPIO
se configuran correctamente, el sistema de compilación de Android incluye el ACPIO especificado por la variable BOARD_RECOVERY_ACPIO
en recovery.img
.