Para implementar las actualizaciones inalámbricas (OTA), el bootloader debe poder acceder a un disco RAM de recuperación durante el arranque. Si el dispositivo usa una imagen de recuperación de AOSP sin modificar, el bootloader lee los primeros 32 bytes de la partición misc
. Si los datos coinciden con boot-recovery
, el bootloader inicia la imagen recovery
. Este método permite que cualquier trabajo de recuperación pendiente (por ejemplo, aplicar una OTA o quitar datos) continúe hasta completarse.
Para obtener detalles sobre el contenido de un bloque en la memoria flash que se usa para las comunicaciones de recuperación y el bootloader, consulta bootable/recovery/bootloader_message/bootloader_message.h.
Dispositivos con actualizaciones de A/B
Para admitir actualizaciones inalámbricas en dispositivos que usan actualizaciones A/B, asegúrate de que el cargador de arranque del dispositivo cumpla con los siguientes criterios.
Criterios generales
Todas las particiones actualizadas a través de una OTA deben poder actualizarse mientras se inicia el sistema principal (y no se actualizan en la recuperación).
Para iniciar la partición
system
, el cargador de arranque pasa el siguiente valor en la línea de comandos del kernel:ro root=/dev/[node] rootwait init=/init
.El framework de Android es responsable de llamar a
markBootSuccessful
desde el HAL. El bootloader nunca debe marcar una partición como iniciada correctamente.
Compatibilidad con la HAL de control de inicio
El cargador de arranque debe admitir el HAL de boot_control
como se define en hardware/libhardware/include/hardware/boot_control.h
. El actualizador consulta el HAL de control de arranque, actualiza la ranura de arranque que no está en uso, cambia la ranura activa con el HAL y reinicia el sistema operativo actualizado. Para obtener más información, consulta Cómo implementar el HAL de control de arranque.
Compatibilidad con ranuras
El bootloader debe admitir la funcionalidad relacionada con las particiones y las ranuras, lo que incluye lo siguiente:
Los nombres de partición deben incluir un sufijo que identifique a qué ranura en el cargador de arranque pertenecen las particiones. Para cada partición de este tipo, hay una variable correspondiente
has-slot:partition base name
con un valor deyes
. Las ranuras se nombran alfabéticamente como a, b, c, etcétera, y corresponden a particiones con el sufijo_a
,_b
,_c
, etcétera. El cargador de arranque debe informar al sistema operativo qué ranura se inició con la propiedad de línea de comandosandroidboot.slot_suffix
. Esta propiedad se establece a través de bootconfig para los dispositivos que se lanzan con Android 12 o versiones posteriores.El HAL de control de arranque restablece el valor de
slot-retry-count
a un valor positivo (por lo general,3
) a través de la devolución de llamadasetActiveBootSlot
o del comandofastboot set_active
. Cuando se modifica una partición que forma parte de una ranura, el cargador de arranque borra el mensaje "Se inició correctamente" y restablece el recuento de reintentos de la ranura.
El cargador de arranque también debe determinar qué ranura cargar. En la figura, se muestra un ejemplo del proceso de toma de decisiones.

Determina qué ranura intentar. No intentes cargar una ranura marcada como
slot-unbootable
. Esta ranura debe ser coherente con los valores que devuelve fastboot y se conoce como la ranura actual.Si la ranura actual no está marcada como
slot-successful
y tiene unslot-retry-count = 0
, márcala comoslot-unbootable
. Luego, selecciona otra ranura que no esté marcada comounbootable
y que esté marcada comoslot-successful
. Esta ranura ahora es la ranura seleccionada. Si no hay una ranura actual disponible, se debe iniciar el sistema en modo de recuperación o mostrar un mensaje de error significativo al usuario.Selecciona el
boot.img
adecuado y, luego, incluye la ruta de acceso a la partición del sistema correcta en la línea de comandos del kernel.Propaga el parámetro
slot_suffix
de la línea de comandos del kernel.Inicio. Si no está marcado como
slot-successful
, disminuyeslot-retry-count
.
La utilidad fastboot
determina qué partición se debe escribir en la memoria flash cuando se ejecutan comandos de escritura en la memoria flash. Por ejemplo, ejecutar el comando fastboot flash system system.img
primero consulta la variable current-slot
y, luego, concatena el resultado al sistema para generar el nombre de la partición que se debe escribir en la memoria flash (system_a
, system_b
, etcétera).
Cuando se configura la ranura actual con el comando set_active
de fastboot o el comando setActiveBootSlot
del HAL de control de arranque, el bootloader debe actualizar la ranura actual, borrar slot-unbootable
y slot-successful
, y restablecer el recuento de reintentos (esta es la única forma de borrar slot-unbootable
).
Dispositivos sin actualizaciones A/B
Para admitir actualizaciones inalámbricas en dispositivos que no usan actualizaciones A/B (consulta Dispositivos actualizables que no son A/B), asegúrate de que el bootloader del dispositivo cumpla con los siguientes criterios.
La partición
recovery
debe contener una imagen que pueda leer una imagen del sistema desde alguna partición compatible (cache
,userdata
) y escribirla en la particiónsystem
.El bootloader debe admitir el inicio directo en el modo de recuperación.
Si se admiten las actualizaciones de imágenes de radio, la partición
recovery
también debería poder escribir la radio en la memoria flash. Esto se puede hacer de una de las siguientes maneras:El bootloader escribe la radio en la memoria flash. En este caso, debería ser posible reiniciar desde la partición de recuperación al bootloader para completar la actualización.
La imagen de recuperación escribe la radio en la memoria flash. Esta funcionalidad se puede proporcionar como una biblioteca o utilidad binaria.