Imágenes de recuperación

En dispositivos que no son A/B, la imagen de recuperación debe contener información de un blob de árbol de dispositivos (DTB) o de una imagen superpuesta de interfaz de alimentación y configuración avanzada (ACPI) . Cuando dichos dispositivos se inician en recuperación, el gestor de arranque puede cargar la imagen superpuesta que sea compatible con la imagen de recuperación. Los dispositivos que admiten actualizaciones A/B (continuas) deben usar la recuperación como inicio en lugar de una partición de recuperación separada (para obtener más detalles, consulte 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 difieren entre las versiones de Android.

Liberar Esquema de actualización Cumplimiento de GKI Versión del encabezado de inicio (dispositivos de inicio) Versión del encabezado de arranque (actualización de dispositivos) Se requiere una imagen de recuperación dedicada
11 A/B,
Virtual A/B
3 * N / A No
A/B,
Virtual A/B
No 2, 3 0, 1, 2, 3 No
no A/B 3 N / A
no A/B No 2, 3 0, 1, 2, 3
10 (Q) A/B N / A 2 0, 1, 2 No
no A/B N / A 2 0, 1, 2
9 (P) A/B N / A 1 0, 1 No
no A/B N / A 1 0, 1
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)

* Los dispositivos A/B que ejecutan Android 11 o superior y usan la imagen de kernel genérica (GKI) deben usar una versión 3 del encabezado de arranque principal 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 utilizan dos conjuntos de particiones (incluidos boot y dtbo ) 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 son A/B que se inician con Android 11 o superior y usan una versión de encabezado de inicio 3 deben especificar explícitamente una versión de encabezado de inicio 2 para la imagen de recuperación por separado. Por ejemplo:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • Para 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 fallas de OTA e imágenes de recuperación

Para evitar fallas inalámbricas (OTA) en dispositivos que no son 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 ocurrir 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 son A/B y ejecutan 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 la imagen de inicio ( debe utilizar 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 que no son A/B y ejecutan Android 9 o superior, actualice la estructura de la imagen de inicio 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
Disco RAM (m páginas) m = ( ramdisk_size + page_size - 1) / page_size
Gestor 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 inicio y las rutas de las imágenes superpuestas, consulte Control de versiones del encabezado de la imagen de inicio .

Implementación de DTBO

Los dispositivos que no son A/B y 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 en true :

     BOARD_INCLUDE_RECOVERY_DTBO := true
    
  • Amplíe la variable BOARD_MKBOOTIMG_ARGS para especificar la versión del encabezado de la imagen de inicio:

    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é configurada en la ruta de la imagen DTBO. El sistema de compilación de Android utiliza la variable para configurar el argumento recovery_dtbo de la herramienta mkbootimg 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 .

Implementación de ACPIO

Los dispositivos que no son A/B y ejecutan Android 9 o superior pueden usar una imagen superpuesta 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 en true :

    BOARD_INCLUDE_RECOVERY_ACPIO := true
    
  • Amplíe la variable BOARD_MKBOOTIMG_ARGS para especificar la versión del encabezado de la imagen de inicio. 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 utiliza la variable para configurar el argumento recovery_acpio de la herramienta mkbootimg 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 .