Actualizaciones del sistema que no son de A/B

Las actualizaciones que no son de AB son una metodología OTA obsoleta que usan los dispositivos Android más antiguos (Android 6 y versiones anteriores). Estos dispositivos tienen una partición de recuperación dedicada que contiene el software necesario para descomprimir un paquete de actualización descargado y aplicar la actualización a las otras particiones.

En dispositivos Android más antiguos sin particiones A/B, el espacio de la memoria flash suele contener las siguientes particiones:

inicio
Contiene el kernel de Linux y un sistema de archivos raíz mínimo (cargado en un disco RAM). Activa el sistema y otras particiones, y comienza el entorno de ejecución ubicado en la partición del sistema.
sistema
Contiene aplicaciones y bibliotecas del sistema que tienen código fuente disponible en el Proyecto de código abierto de Android (AOSP). Durante el funcionamiento normal, esta partición se activa de solo lectura, y su contenido solo cambia durante una actualización inalámbrica.
de proveedor
Contiene aplicaciones y bibliotecas del sistema que no tienen código fuente disponible en el Proyecto de código abierto de Android (AOSP). Durante el funcionamiento normal, esta partición se activa en modo de solo lectura, y su contenido cambia solo durante una actualización inalámbrica.
userdata
Almacena los datos guardados por las aplicaciones que instaló el usuario, etcétera. Por lo general, el proceso de actualización OTA no afecta a esta partición.
caché
Área de retención temporal que usan algunas aplicaciones (acceder a esta partición requiere permisos especiales de la app) y para el almacenamiento de paquetes de actualización OTA descargados. Otros programas usan este espacio con la expectativa de que los archivos puedan desaparecer en cualquier momento. Algunas instalaciones de paquetes OTA pueden borrar esta partición por completo. La caché también contiene los registros de actualización de una actualización OTA.
recuperación
Contiene un segundo sistema Linux completo, incluido un kernel y el binario de recuperación especial que lee un paquete y usa su contenido para actualizar las otras particiones.
misc
Es una partición pequeña que usa la recuperación para ocultar información sobre lo que está haciendo en caso de que se reinicie el dispositivo mientras se aplica el paquete OTA.

Vida útil de una actualización OTA

Una actualización OTA típica contiene los siguientes pasos:

  1. El dispositivo realiza un registro periódico en los servidores OTA y recibe una notificación sobre la disponibilidad de una actualización, incluida la URL del paquete de actualización y una cadena de descripción para mostrarle al usuario.
  2. Actualiza las descargas a una partición de caché o de datos, y su firma criptográfica se verifica con los certificados de /system/etc/security/otacerts.zip. Se le solicita al usuario que instale la actualización.
  3. El dispositivo se reinicia en el modo de recuperación, en el que se inician el kernel y el sistema de la partición de recuperación en lugar del kernel de la partición de inicio.
  4. init inicia el binario de recuperación. Encuentra argumentos de línea de comandos en /cache/recovery/command que lo dirigen al paquete descargado.
  5. La recuperación verifica la firma criptográfica del paquete con las claves públicas en /res/keys (parte del disco de RAM contenido en la partición de recuperación).
  6. Los datos se extraen del paquete y se usan para actualizar las particiones de inicio, del sistema o del proveedor según sea necesario. Uno de los archivos nuevos que quedan en la partición del sistema contiene el contenido de la nueva partición de recuperación.
  7. El dispositivo se reinicia de forma normal.
    1. Se carga la partición de inicio actualizada, se activa y comienza a ejecutar objetos binarios en la partición del sistema actualizada.
    2. Como parte del inicio normal, el sistema verifica el contenido de la partición de recuperación con el contenido deseado (que antes se almacenaba como un archivo en /system). Son diferentes, por lo que la partición de recuperación se vuelve a escribir con el contenido deseado. (En los arranques posteriores, la partición de recuperación ya contiene el contenido nuevo, por lo que no es necesario volver a escribir en la memoria flash).

Se completó la actualización del sistema. Los registros de actualización se pueden encontrar en /cache/recovery/last_log.#.

Actualiza los paquetes

Un paquete de actualización es un archivo .zip que contiene el objeto binario ejecutable META-INF/com/google/android/update-binary. Después de verificar la firma en el paquete, recovery extrae este objeto binario a /tmp y lo ejecuta, pasando los siguientes argumentos:

  • Actualiza el número de versión de la API binaria. Si cambian los argumentos que se pasan al binario de actualización, este número aumenta.
  • Es el descriptor de archivo del canal de comandos. El programa de actualización puede usar este canal para enviar comandos al binario de recuperación, principalmente para cambios en la IU, como indicar el progreso al usuario.
  • Nombre del archivo .zip del paquete de actualización.

Un paquete de actualización puede usar cualquier objeto binario vinculado estáticamente como el objeto binario de actualización. Las herramientas de compilación de paquetes OTA usan el programa de actualización (bootable/recovery/updater), que proporciona un lenguaje de secuencias de comandos simple que puede realizar muchas tareas de instalación. Puedes reemplazar cualquier otro objeto binario que se ejecute en el dispositivo.

Para obtener detalles sobre el binario del actualizador, la sintaxis de edify y las funciones integradas, consulta Dentro de los paquetes inalámbricos.

Cómo migrar desde versiones anteriores

Cuando se migra desde la versión de Android 2.3/3.0/4.0, el cambio principal es la conversión de todas las funciones específicas del dispositivo de un conjunto de funciones C con nombres predefinidos a objetos C++. En la siguiente tabla, se enumeran las funciones anteriores y los métodos nuevos que tienen un propósito aproximadamente equivalente:

Función C Método de C++
device_recovery_start() Device::RecoveryStart()
device_toggle_display()
device_reboot_now()
RecoveryUI::CheckKey()
(también RecoveryUI::IsKeyPressed())
device_handle_key() Device::HandleMenuKey()
device_perform_action() Device::InvokeMenuItem()
device_wipe_data() Device::WipeData()
device_ui_init() ScreenRecoveryUI::Init()

La conversión de funciones anteriores a métodos nuevos debería ser bastante sencilla. No olvides agregar la nueva función make_device() para crear y mostrar una instancia de tu nueva subclase de Device.