Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Actualizaciones del sistema no A / B

En dispositivos Android más antiguos sin particiones A / B, el espacio flash normalmente contiene las siguientes particiones:

bota
Contiene el kernel de Linux y un sistema de archivos raíz mínimo (cargado en un disco RAM). Monta el sistema y otras particiones e inicia el tiempo de ejecución ubicado en la partición del sistema.
sistema
Contiene aplicaciones del sistema y bibliotecas que tienen código fuente disponible en Android Open Source Project (AOSP). Durante el funcionamiento normal, esta partición se monta como de solo lectura; su contenido cambia solo durante una actualización OTA.
vendedor
Contiene aplicaciones y bibliotecas del sistema que no tienen código fuente disponible en Android Open Source Project (AOSP). Durante el funcionamiento normal, esta partición se monta como de solo lectura; su contenido cambia solo durante una actualización OTA.
datos del usuario
Almacena los datos guardados por las aplicaciones instaladas por el usuario, etc. Normalmente, el proceso de actualización OTA no toca esta partición.
cache
Área de espera temporal utilizada por algunas aplicaciones (el acceso a esta partición requiere permisos especiales de aplicación) y para el almacenamiento de los paquetes de actualización OTA descargados. Otros programas utilizan este espacio con la expectativa de que los archivos puedan desaparecer en cualquier momento. Algunas instalaciones de paquetes OTA pueden hacer que esta partición se borre 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, que incluye un kernel y el binario de recuperación especial que lee un paquete y usa su contenido para actualizar las otras particiones.
misceláneo
Pequeña partición utilizada por la recuperación para ocultar información sobre lo que está haciendo en caso de que el dispositivo se reinicie mientras se aplica el paquete OTA.

Vida de una actualización de OTA

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

  1. El dispositivo realiza un registro regular con los servidores OTA y se le notifica de la disponibilidad de una actualización, incluida la URL del paquete de actualización y una cadena de descripción para mostrársela al usuario.
  2. Actualice las descargas a una caché o partición de datos, y su firma criptográfica se verifica con los certificados en /system/etc/security/otacerts.zip . Se solicita al usuario que instale la actualización.
  3. El dispositivo se reinicia en modo de recuperación, en el que el kernel y el sistema de la partición de recuperación se inician en lugar del kernel de la partición de inicio.
  4. El binario de recuperación lo inicia init. Encuentra argumentos de línea de comandos en /cache/recovery/command que lo apuntan al paquete descargado.
  5. Recovery verifica la firma criptográfica del paquete con las claves públicas en /res/keys (parte del disco RAM contenido en la partición de recuperación).
  6. Los datos se extraen del paquete y se utilizan para actualizar el arranque, el sistema y las particiones del proveedor según sea necesario. Uno de los nuevos archivos que quedan en la partición del sistema contiene el contenido de la nueva partición de recuperación.
  7. El dispositivo se reinicia normalmente.
    1. Se carga la partición de arranque recién actualizada, se monta y comienza a ejecutar binarios en la partición del sistema recién actualizada.
    2. Como parte del inicio normal, el sistema verifica el contenido de la partición de recuperación con el contenido deseado (que se almacenó previamente como un archivo en /system ). Son diferentes, por lo que la partición de recuperación se actualiza con el contenido deseado. (En arranques posteriores, la partición de recuperación ya contiene el nuevo contenido, por lo que no es necesario actualizarlo).

¡La actualización del sistema está completa! Los registros de actualización se pueden encontrar en /cache/recovery/last_log. # .

Actualizar paquetes

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

  • Actualice el número de versión de la API binaria . Si los argumentos pasados ​​al binario de actualización cambian, este número aumenta.
  • Descriptor de archivo de la tubería de comando . El programa de actualización puede usar esta tubería para enviar comandos al binario de recuperación, principalmente para cambios en la interfaz de usuario, como indicar el progreso al usuario.
  • Nombre de archivo del archivo .zip paquete de actualización .

Un paquete de actualización puede usar cualquier binario vinculado estáticamente como binario de actualización. Las herramientas de construcción de paquetes OTA utilizan el programa de actualización (de bootable/recovery/updater ), que proporciona un lenguaje de programación simple que puede realizar muchas tareas de instalación. Puede sustituir cualquier otro binario que se ejecute en el dispositivo.

Para obtener detalles sobre el binario del actualizador, la sintaxis de edición y las funciones integradas, consulte Dentro de los paquetes OTA .

Migrar desde versiones anteriores

Al migrar 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 ++. La siguiente tabla enumera las funciones antiguas y los métodos nuevos que tienen un propósito más o menos equivalente:

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

La conversión de funciones antiguas a métodos nuevos debería ser razonablemente sencilla. No olvide agregar la nueva función make_device() para crear y devolver una instancia de su nueva subclase de dispositivo.