OTA para dispositivos A/B con particiones dinámicas

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

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

Fondo

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

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

Luego, el dispositivo de bloque para super debe existir en /dev/block/bootdevice/by-name/super , pero no es necesario que la super aparezca en el archivo fstab .

En la super , hay dos ranuras de metadatos , numeradas 0 y 1, que corresponden a las ranuras A/B para particiones. En esta página, las ranuras de metadatos se denominan Metadatos S (fuente) y Metadatos T (destino). De manera similar, las particiones se denominan system_s , vendor_t , etc.

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

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

Un ejemplo de metadatos en un dispositivo es el siguiente.

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

Puede utilizar la herramienta lpdump (código fuente en system/extras/partition_tools ) para volcar los metadatos en su 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. Inicialice los metadatos de la super .
    1. Cargue las extensiones de las particiones dinámicas de origen desde Metadata S. Sea M los metadatos cargados.
    2. Elimine los grupos de destino y las particiones (por ejemplo, foo_t , bar_t ) de M para que M contenga solo particiones y grupos con el sufijo _s .
    3. Agregue grupos de destino y particiones de acuerdo con el dynamic_partition_metadata en el manifiesto de actualización.
      El tamaño de cada partición se puede encontrar en new_partition_info .
    4. Escriba M en metadatos T.
    5. Asigne las particiones agregadas en el asignador de dispositivos como escribibles.
  2. Aplique la actualización en los dispositivos bloqueados.
    1. Si es necesario, asigne las particiones de origen en el asignador de dispositivos como de solo lectura. Esto es necesario para la descarga porque las particiones de origen no están asignadas antes de la actualización.
    2. Aplique una actualización completa o delta a todos los dispositivos de bloque en la ranura de destino.
    3. Monte las particiones para ejecutar el script posterior a la instalación y luego desmonte las particiones.
  3. Desasignar 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

Agregar grupos y particiones al manifiesto de actualización

Al realizar una actualización OTA en un dispositivo A/B con particiones dinámicas, o en un dispositivo A/B que agrega soporte para particiones dinámicas, debe agregar grupos y particiones al manifiesto de actualización. El siguiente fragmento muestra información adicional sobre el manifiesto de actualización para admitir particiones dinámicas. Consulte 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;
}