Android 10 admite particiones dinámicas, un sistema de partición de espacio de usuario que puede crear, cambiar el 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, para dispositivos que ejecutan Android 9 y versiones anteriores.
Fondo
Hay una partición super en el dispositivo. Esta
partición no tiene el sufijo de ranura. El dispositivo de bloque debe existir junto
con la blk_device entrada para /misc en
fstab. Por ejemplo, si el archivo fstab muestra lo siguiente:
/dev/block/bootdevice/by-name/misc /misc # Other fields
Entonces, el dispositivo de bloque para super debe existir en
/dev/block/bootdevice/by-name/super, pero no es necesario que la partición
super aparezca en el archivo
fstab.
En la partición super, hay dos
ranuras de metadatos, numeradas como 0 y 1, que corresponden a
las ranuras 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 denominan system_s,
vendor_t, etcétera.
Antes de la actualización, los metadatos S contienen 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 Implementa 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
- Partición
- Grupo bar_a
- Partición
vendor_a - Partición
product_a - Otras particiones actualizadas por Bar
- Partición
- Grupo
foo_b(remanente de la actualización anterior) - Grupo
bar_b(remanente de la actualización anterior)
- Grupo
- 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
- Partición
- Grupo
bar_b- Partición
vendor_b - Partición
product_b - Otras particiones actualizadas por Bar
- Partición
- Grupo
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/superlpdump --slot 1 /dev/block/bootdevice/by-name/super
Flujo de actualización
- Inicializa los metadatos de la partición
super.- Carga las extensiones de las particiones dinámicas de origen desde los metadatos S. Sea M los metadatos cargados.
-
Quita los grupos y las particiones de destino (por ejemplo,
foo_t,bar_t) de M para que M contenga solo particiones y grupos con el sufijo_s. -
Agrega grupos y particiones de destino según el
dynamic_partition_metadatacampo en el update manifest.
El tamaño de cada partición se puede encontrar ennew_partition_info. - Escribe M en los metadatos T.
- Asigna las particiones agregadas en el asignador de dispositivos como grabables.
- Aplica la actualización en los dispositivos de bloque.
- Si es necesario, asigna las particiones de origen en el asignador de dispositivos como de solo lectura. Esto es necesario para la carga lateral, ya que las particiones de origen no se asignan antes de la actualización.
- Aplica una actualización completa o delta a todos los dispositivos de bloque en la ranura de destino.
- Monta las particiones para ejecutar la secuencia de comandos posterior a la instalación y, luego, desmonta las particiones.
- 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. El siguiente fragmento 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;
}