Actualización inalámbrica para dispositivos A/B con particiones dinámicas

Android 10 admite particiones dinámicas, un sistema de particiones de espacio de usuario que puede crear, cambiar de tamaño y destruir particiones durante las actualizaciones inalámbricas (OTA).

En esta página, se describe cómo cambiar el tamaño de las particiones dinámicas durante una actualización para dispositivos A/B que se lanzaron con compatibilidad con particiones dinámicas y para dispositivos que ejecutan Android 9 y versiones anteriores.

Información general

Hay una partición super en el dispositivo. Esta partición no tiene sufijo de ranura. El dispositivo de bloqueo debe existir junto con la entrada blk_device para /misc en fstab. Por ejemplo, si el archivo fstab incluye lo siguiente:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

Entonces, el dispositivo de bloqueo para super debe existir en /dev/block/bootdevice/by-name/super, pero la partición super no necesita aparecer en el archivo fstab.

En la partición super, hay dos ranuras de metadatos, numeradas como 0 y 1, que corresponden a las ranuras de A/B para las particiones. En esta página, las ranuras de metadatos se denominan Metadatos S (fuente) y Metadatos T (destino). Del mismo modo, las particiones se conocen como system_s, vendor_t, etcétera.

Antes de la actualización, Metadata S contiene la información de las particiones dinámicas que se usan (por lo general, system_s, vendor_s, product_s, etcétera). El sistema lee las extensiones de estas particiones durante la actualización, por lo que no se pueden borrar.

Las particiones pertenecen a grupos de actualización. Consulta Implementación de particiones dinámicas para obtener más información.

A continuación, se muestra un ejemplo de metadatos en un dispositivo.

  • Metadatos 0
    • Grupo foo_a
      • Partición system_a
      • Partición product_services_a
      • Otras particiones actualizadas por Foo
    • Group bar_a
      • Partición vendor_a
      • Partición product_a
      • Otras particiones actualizadas por Bar
    • Grupo foo_b (remanente de la actualización anterior)
    • Grupo bar_b (remanente de la actualización anterior)
  • Metadatos 1
    • Grupo foo_a (remanente de la actualización anterior)
    • Grupo bar_a (remanente de la actualización anterior)
    • Grupo foo_b
      • Partición system_b
      • Partición product_services_b
      • Otras particiones actualizadas por Foo
    • Grupo bar_b
      • Partición vendor_b
      • Partición product_b
      • Otras particiones actualizadas por Bar

Puedes usar la herramienta lpdump (código fuente en system/extras/partition_tools) para volcar los metadatos en tu dispositivo. Por ejemplo:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

Flujo de actualización

  1. Inicializa los metadatos de la partición super.
    1. Carga las extensiones de las particiones dinámicas de origen desde Metadata S. Sea M los metadatos cargados.
    2. Quita los grupos y las particiones de segmentación (por ejemplo, foo_t, bar_t) de M para que M solo contenga particiones y grupos con el sufijo _s.
    3. Agrega grupos y particiones de segmentación según el campo dynamic_partition_metadata en el manifiesto de actualización.
      El tamaño de cada partición se puede encontrar en new_partition_info.
    4. Escribe M en los metadatos de T.
    5. Asigna las particiones agregadas en el asignador de dispositivos como grabables.
  2. Aplica la actualización en los dispositivos de bloqueo.
    1. Si es necesario, asigna las particiones de origen en el asignador de dispositivos como de solo lectura. Esto es necesario para la carga lateral porque las particiones de origen no se asignan antes de la actualización.
    2. Aplica una actualización completa o delta a todos los dispositivos de bloque en la ranura de destino.
    3. Monta las particiones para ejecutar la secuencia de comandos posterior a la instalación y, luego, desmonta las particiones.
  3. Anula la asignación de las particiones de destino.

Antes y después de la actualización, las siguientes propiedades del sistema deben tener los valores respectivos:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

Agrega grupos y particiones al manifiesto de actualización

Cuando realices una actualización OTA en un dispositivo A/B con particiones dinámicas, o en un dispositivo A/B que agregue compatibilidad con particiones dinámicas, deberás agregar grupos y particiones al manifiesto de actualización. En el siguiente fragmento, se muestra información adicional sobre el manifiesto de actualización para admitir particiones dinámicas. Consulta update_metadata.proto para obtener documentación detallada sobre cada campo.

message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}

message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}

message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}