Android 10 es compatible particiones dinámicas, una partición de espacio de usuario que puede crear, cambiar el tamaño y destruir particiones durante las actualizaciones inalámbricas.
En esta página, se describe cómo los clientes inalámbricos cambian el tamaño de las particiones dinámicas durante una actualización de dispositivos A/B que se lanzó sin compatibilidad con particiones dinámicas y cómo los clientes de OTA se actualizaron a Android 10.
Segundo plano
Durante la actualización de un dispositivo A/B para admitir particiones dinámicas, el
La tabla de particiones GUID (GPT) en el dispositivo se conserva, por lo que
super
en el dispositivo. Los metadatos se almacenan en system_a
y system_b
, pero se pueden personalizar cambiando BOARD_SUPER_PARTITION_METADATA_DEVICE
.
En cada uno de los dispositivos de almacenamiento en bloque, hay dos ranuras de metadatos. Solo uno
de metadatos en cada dispositivo de almacenamiento en bloques. Por ejemplo, Metadata 0 en
system_a
y Metadata 1 en system_b
a las particiones en las ranuras A y B, respectivamente. En
del tiempo de ejecución, no importa qué ranura se actualice.
En esta página, los espacios de metadatos se denominan Metadata S (fuente) y Metadata T (destino). Del mismo modo, las particiones se denominan system_s
, vendor_t
, etcétera.
Para obtener más información sobre las configuraciones del sistema de compilación, consulta Cómo actualizar dispositivos.
Para obtener más información sobre cómo pertenecen las particiones a update grupos, consulta Juego de mesa cambios en la configuración de los dispositivos nuevos.
Un ejemplo de metadatos en un dispositivo es el siguiente:
- Dispositivo de almacenamiento en bloques físico
system_a
- Metadatos 0
- Grupo
foo_a
- Partición lógica (dinámica)
system_a
- Partición lógica (dinámica)
product_services_a
- Otras particiones actualizadas por Foo
- Partición lógica (dinámica)
- Grupo
bar_a
- Partición lógica (dinámica)
vendor_a
- Partición lógica (dinámica)
product_a
- Otras particiones actualizadas por Bar
- Partición lógica (dinámica)
- Grupo
- Metadatos 1 (sin usar)
- Metadatos 0
- Dispositivo de bloque físico
system_b
- Metadatos 0 (no se usa)
- Metadatos 1
- Grupo foo_b
- Partición lógica (dinámica)
system_b
- Partición lógica (dinámica)
product_services_b
- Otras particiones actualizadas por Foo
- Partición lógica (dinámica)
- Agrupa bar_b
- Partición lógica (dinámica)
vendor_b
- Partición lógica (dinámica)
product_b
- Otras particiones actualizadas por Bar
- Partición lógica (dinámica)
- Grupo foo_b
Puedes usar la herramienta lpdump
en system/extras/partition_tools
para volcar los metadatos en tu dispositivo. Por ejemplo:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Actualiza una actualización
En los dispositivos que ejecutan Android 9 y versiones anteriores, el cliente OTA del dispositivo no admite la asignación de particiones dinámicas antes de la actualización. Se crea un conjunto adicional de parches para que la asignación se pueda aplicar directamente a las particiones físicas existentes.
El generador de OTA compila el archivo super.img
final que contiene el contenido de todas las particiones dinámicas y, luego, divide la imagen en varias imágenes que coinciden con los tamaños de los dispositivos de bloques físicos correspondientes al sistema, al proveedor, etcétera. Estas imágenes se denominan super_system.img
, super_vendor.img
, etcétera.
El cliente inalámbrico aplica estas imágenes a las particiones físicas, en lugar
que aplicar las imágenes a las particiones lógicas (dinámicas).
Debido a que el cliente inalámbrico no sabe cómo asignar particiones dinámicas, todos los pasos posteriores a la instalación se inhabilitan automáticamente para estas particiones cuando se genera el paquete de actualización. Consulta Configuración posterior a la instalación para obtener más información.
El flujo de actualización es el mismo que en Android 9.
Antes de la actualización:
ro.boot.dynamic_partitions= ro.boot.dynamic_partitions_retrofit=
Después de la actualización:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Actualizaciones futuras después del reajuste
Después de la actualización de la retroadaptación, el cliente OTA se actualiza para funcionar con particiones dinámicas. Los límites de las particiones de origen nunca se extienden a las particiones físicas de destino.
Cómo actualizar el flujo con un paquete de actualización normal
- Inicializa los metadatos de la partición
super
.-
Construye nuevos metadatos M a partir de los metadatos S (metadatos de fuente).
Por ejemplo, si Metadata S usa [
system_s
,vendor_s
,product_s
] como bloque entonces el nuevo metadato M utiliza [system_t
,vendor_t
,product_t
] como bloque dispositivos. Todos los grupos y particiones se descartan en M. -
Agrega grupos y particiones de destino según el campo
dynamic_partition_metadata
en el manifiesto de actualización. El tamaño de cada partición se puede encontrar ennew_partition_info
. - Escribir M en Metadata T.
- Asigna las particiones agregadas en el asignador de dispositivos como escribibles.
-
Construye nuevos metadatos M a partir de los metadatos S (metadatos de fuente).
Por ejemplo, si Metadata S usa [
- Aplica la actualización en los dispositivos de almacenamiento en bloques.
- Si es necesario, asigna las particiones de origen en el asignador de dispositivos como de solo lectura. Esto es necesario para la transferencia las particiones de origen no se asignan antes de la actualización.
- Aplica una actualización completa o delta a todos los dispositivos de almacenamiento en bloques ranura de destino.
- Activa las particiones para ejecutar la secuencia de comandos posterior a la instalación y, luego, desactivar las particiones.
- Desasignar las particiones de destino
Flujo de actualización con un paquete de actualización de retrofit
Si el paquete de actualización de retroadaptación se aplica en un dispositivo que ya habilita particiones dinámicas, el cliente OTA aplica el archivo super.img
dividido directamente en los dispositivos de almacenamiento en bloque. La actualización
es similar a una actualización de Retrofit. Consulta
Actualiza una actualización
para conocer los detalles.
Por ejemplo, supongamos lo siguiente:
- El zócalo A es el activo.
-
system_a
contiene los metadatos activos en el espacio 0. -
system_a
,vendor_a
yproduct_a
se usan como dispositivos de almacenamiento en bloque.
Cuando el cliente inalámbrico recibe un paquete de actualización de Retrofit, se aplica
super_system.img
en dispositivos físicos de system_b
,
super_vendor.img
en el vendor_b
físico
super_product.img
en el product_b
físico.
El dispositivo de bloques físico system_b
contiene la información correcta
metadatos para asignar el system_b
lógico,
vendor_b
y product_b
en el momento del inicio.
Genera paquetes de actualización
OTA incremental
Cuando se generan OTA incrementales para dispositivos de reacondicionamiento, las actualizaciones dependen de si la compilación base define PRODUCT_USE_DYNAMIC_PARTITIONS
y PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
.
-
Si la compilación base no define las variables, se trata de un
y la actualización de la adaptación. El paquete de actualización contiene la división
super.img
e inhabilita el paso posterior a la instalación. - Si la compilación base define las variables, esto es lo mismo que una actualización típica con particiones dinámicas. El paquete de actualización contiene las imágenes de particiones lógicas (dinámicas). Se puede habilitar el paso posterior a la instalación.
OTA completa
Se generan dos paquetes inalámbricos completos para dispositivos actualizados.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
siempre contiene dividirsuper.img
e inhabilita el paso posterior a la instalación para la actualización del ajuste.-
Se genera con un argumento adicional
--retrofit_dynamic_partitions
a la secuencia de comandosota_from_target_files
. - Se puede aplicar a todas las compilaciones.
-
Se genera con un argumento adicional
-
$(PRODUCT)-ota-$(TAG).zip
contiene imágenes lógicas para actualizaciones futuras.- Aplica esto solo a compilaciones con particiones dinámicas habilitado. Consulta los detalles a continuación para aplicar esta medida.
Rechaza la actualización no retrocompatible en compilaciones anteriores
Aplica el paquete inalámbrico completo normal solo a las compilaciones con las particiones dinámicas habilitadas. Si el servidor inalámbrico está configurado incorrectamente y envía estos paquetes a dispositivos con Android 9 o o menos, los dispositivos no se inician. El cliente OTA en Android 9 y versiones anteriores no puede distinguir entre un paquete OTA de actualización y un paquete OTA completo normal, por lo que el cliente no rechazará el paquete completo.
Para evitar que el dispositivo acepte el paquete OTA completo, puedes requerir un paso posterior a la instalación para verificar la configuración existente del dispositivo. Por ejemplo:
device/device_name/dynamic_partitions/check_dynamic_partitions
#!/system/bin/sh DP_PROPERTY_NAME="ro.boot.dynamic_partitions" DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit" DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME}) DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME}) if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then echo "Error: applied non-retrofit update on build without dynamic" \ "partitions." echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}" echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}" exit 1 fi
device/device_name/dynamic_partitions/Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= check_dynamic_partitions LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_SRC_FILES := check_dynamic_partitions LOCAL_PRODUCT_MODULE := true include $(BUILD_PREBUILT)
device/device_name/device.mk
PRODUCT_PACKAGES += check_dynamic_partitions # OPTIONAL=false so that the error in check_dynamic_partitions will be # propagated to OTA client. AB_OTA_POSTINSTALL_CONFIG += \ RUN_POSTINSTALL_product=true \ POSTINSTALL_PATH_product=bin/check_dynamic_partitions \ FILESYSTEM_TYPE_product=ext4 \ POSTINSTALL_OPTIONAL_product=false \
Cuando se aplica el paquete inalámbrico normal en un dispositivo sin datos dinámicos
particiones habilitadas, el cliente inalámbrico ejecuta
check_dynamic_partitions
como paso posterior a la instalación y
rechaza la actualización.