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 compatibilidad con 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 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 la partición super no necesita estar listada en el archivo fstab .

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

Antes de la actualización, Metadata S contiene la información de las particiones dinámicas que se utilizan (por lo general, 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
      • Partición vendor_a
      • product_a de partición_a
      • Otras particiones actualizadas por Bar
    • Grupo foo_b (sobras de la actualización anterior)
    • Grupo bar_b (sobras de la actualización anterior)
  • Metadatos 1
    • Grupo foo_a (restos de la actualización anterior)
    • Grupo bar_a (restos 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
      • Partición vendor_b
      • Partición product_b
      • Otras particiones actualizadas por Bar

Puede usar 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 para 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 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. Escriba M en metadatos T.
    5. Asigne las particiones añadidas en el mapeador de dispositivos como escribibles.
  2. Aplicar la actualización en los dispositivos de bloque.
    1. Si es necesario, asigne las particiones de origen en el asignador de dispositivos como de solo lectura. Esto es necesario para la instalación de prueba porque las particiones de origen no se asignan 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 un dispositivo A/B que agrega soporte para particiones dinámicas, debe agregar grupos y particiones al manifiesto de actualización. El fragmento a continuación 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;
}