En los dispositivos que no son A/B, la imagen de recuperación debe contener información de una imagen de superposición de blob del árbol de dispositivos (DTB) o de la Interfaz avanzada de configuración y administración de energía (ACPI). Cuando estos dispositivos se inician en el modo de recuperación, el bootloader puede cargar la imagen de superposición que es compatible con la imagen de recuperación. Los dispositivos que admiten actualizaciones A/B (sin interrupciones) deben usar la recuperación como inicio en lugar de una partición de recuperación separada (para obtener más detalles, consulta Implementación de actualizaciones A/B).
Las opciones para incluir un DTBO/ACPIO de recuperación como parte de la imagen de inicio/recuperación varían entre las versiones de Android.
Lanzamiento | Esquema de actualización | Cumplimiento de GKI | Versión del encabezado de inicio (dispositivos de lanzamiento) | Versión del encabezado de inicio (actualización de dispositivos) | Se requiere una imagen de recuperación dedicada |
---|---|---|---|---|---|
11 | A/B, A/B virtual |
Sí | 3* | N/A | No |
A/B, A/B virtual |
No | 2, 3 | 0, 1, 2, 3 | No | |
non-A/B | Sí | 3 | N/A | Sí | |
non-A/B | No | 2, 3 | 0, 1, 2, 3 | Sí | |
10 (Q) | A/B | N/A | 2 | 0, 1 y 2 | No |
non-A/B | N/A | 2 | 0, 1 y 2 | Sí | |
9 (P) | A/B | N/A | 1 | 0, 1 | No |
non-A/B | N/A | 1 | 0, 1 | Sí | |
8 (O) | A/B | N/A | N/A (se considera 0) | N/A (se considera 0) | No |
non-A/B | N/A | N/A (se considera 0) | N/A (se considera 0) | Sí |
* Los dispositivos A/B que ejecutan Android 11 o versiones posteriores y que usan la imagen genérica del kernel (GKI) deben usar una versión del 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 (incluidas
boot
ydtbo
) y cambian entre ellas durante las actualizaciones, lo que elimina la necesidad de una imagen de recuperación. Los dispositivos A/B aún pueden usar una imagen de recuperación dedicada.Los dispositivos que no son A/B y que se lanzan con Android 11 o versiones posteriores, y que usan una versión 3 del encabezado de arranque, deben especificar de forma explícita una versión 2 del encabezado de arranque para la imagen de recuperación por separado. Por ejemplo:
BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
En el caso de las arquitecturas que no admiten árboles de dispositivos, la imagen de recuperación puede incluir una imagen de ACPIO en lugar de una imagen de DTBO.
Acerca de las fallas de OTA y las imágenes de recuperación
Para evitar fallas en las actualizaciones inalámbricas (OTA) en dispositivos que no son A/B, la imagen de recuperación debe ser autosuficiente y no depender de otras imágenes. Durante una actualización inalámbrica, si se produce un problema después de que se actualiza la imagen de superposición (pero antes de que se complete la actualización completa), el dispositivo intenta iniciarse en el modo de recuperación para completar la actualización inalámbrica. Sin embargo, debido a que la partición de superposición ya se actualizó, podría producirse una discrepancia con la imagen de recuperación (que aún no se actualizó).
Para evitar que la recuperación dependa de la partición de DTBO/ACPIO durante una actualización, los dispositivos que no sean de A/B y que ejecuten Android 9 o versiones posteriores pueden especificar una imagen de DTBO/ACPIO de recuperación que contenga información de la imagen de superposición como una sección separada en el formato de imagen de inicio (debe usar una versión de encabezado de inicio 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 que no son A/B y que ejecutan Android 9 o versiones posteriores, actualiza la estructura de la imagen de inicio de la siguiente manera.
Sección de la imagen de arranque | Cantidad de páginas |
---|---|
Encabezado de inicio (1 página) | 1 |
Kernel (l páginas) | l = (kernel_size + page_size – 1) / page_size |
Ramdisk (m páginas) | m = (ramdisk_size + page_size – 1) / page_size |
Bootloader de segunda etapa (n páginas) | n = (second_size + page_size – 1) / page_size |
DTBO o ACPIO de recuperación (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 acceso de la imagen de superposición, consulta Versión del encabezado de imagen de arranque.
Implementa el DTBO
Los dispositivos que no son A/B y que ejecutan Android 9 o versiones posteriores 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
, haz lo siguiente:
Establece el parámetro de configuración
BOARD_INCLUDE_RECOVERY_DTBO
entrue
:BOARD_INCLUDE_RECOVERY_DTBO := true
Extiende 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úrate de que la variable
BOARD_PREBUILT_DTBOIMAGE
esté configurada 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 variables 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
.
Implementa ACPIO
Los dispositivos que no son A/B y que ejecutan Android 9 o versiones posteriores pueden usar una imagen de superposición de ACPIO (en lugar de una imagen de 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 BoardConfig.mk
del dispositivo, haz lo siguiente:
Establece el parámetro de configuración
BOARD_INCLUDE_RECOVERY_ACPIO
entrue
:BOARD_INCLUDE_RECOVERY_ACPIO := true
Extiende la variable
BOARD_MKBOOTIMG_ARGS
para especificar la versión del encabezado de la imagen de arranque. La variable debe ser mayor o igual que 1 para admitir la recuperación de ACPIO.BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Asegúrate de que la variable
BOARD_RECOVERY_ACPIO
esté configurada en la ruta de la imagen de 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 variables BOARD_INCLUDE_RECOVERY_ACPIO
, BOARD_MKBOOTIMG_ARGS
y BOARD_RECOVERY_ACPIO
están configuradas correctamente, el sistema de compilación de Android incluye el ACPIO especificado por la variable BOARD_RECOVERY_ACPIO
en recovery.img
.