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

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 que no son A/B.

En el caso de los dispositivos que no son A/B, la actualización inalámbrica para particiones dinámicas se aplica con updater dentro del paquete de actualización.

Actualizar dispositivos de lanzamiento

Esta sección se aplica a dispositivos que no son A/B que se inician con compatibilidad con particiones dinámicas. Estos dispositivos se actualizan de Android 10 a versiones posteriores.

Cómo generar paquetes de actualización

La secuencia de comandos ota_from_target_files, que se encuentra en build/make/tools/releasetools, genera los paquetes de actualización OTA. De forma predeterminada, la secuencia de comandos genera un paquete que actualiza system y vendor particiones. Si hay particiones dinámicas adicionales, como product, product_services o odm, sus actualizaciones deben generarse en el código específico del dispositivo.

Para generar actualizaciones, en el módulo extendido de Python, implementa FullOTA_GetBlockDifferences() y IncrementalOTA_GetBlockDifferences() Estos dos muestran una lista de objetos BlockDifference, cada una con la descripción del parche de actualización que se aplicaría por cada partición. Las particiones que devuelvan estas dos funciones no deberían modificarse manualmente o verificarse en otro lugar, por ejemplo, en *_InstallBegin() o *_InstallEnd().

Ejemplo de una generación de actualizaciones:

# device/yoyodyne/tardis/releasetools.py

import os
from common import BlockDifference, EmptyImage, GetUserImage

# The joined list of user image partitions of source and target builds.
# - Items should be added to the list if new dynamic partitions are added.
# - Items should not be removed from the list even if dynamic partitions are
#   deleted. When generating an incremental OTA package, this script needs to
#   know that an image is present in source build but not in target build.
USERIMAGE_PARTITIONS = [
    "product",
    "odm",
]

def GetUserImages(input_tmp, input_zip):
  return {partition: GetUserImage(partition, input_tmp, input_zip)
          for partition in USERIMAGE_PARTITIONS
          if os.path.exists(os.path.join(input_tmp,
                                         "IMAGES", partition + ".img"))}

def FullOTA_GetBlockDifferences(info):
  images = GetUserImages(info.input_tmp, info.input_zip)
  return [BlockDifference(partition, image)
          for partition, image in images.items()]

def IncrementalOTA_GetBlockDifferences(info):
  source_images = GetUserImages(info.source_tmp, info.source_zip)
  target_images = GetUserImages(info.target_tmp, info.target_zip)

  # Use EmptyImage() as a placeholder for partitions that will be deleted.
  for partition in source_images:
    target_images.setdefault(partition, EmptyImage())

  # Use source_images.get() because new partitions are not in source_images.
  return [BlockDifference(partition, target_image, source_images.get(partition))
          for partition, target_image in target_images.items()]

Actualizar flujo

En segundo plano, se agregan las siguientes funciones a edify secuencia de comandos:

  • unmap_partition(name)
    • Si la partición está asignada, anula la asignación. De lo contrario, no hagas nada.
    • Muestra la cadena t si se realiza correctamente o una cadena vacía si se produce un error.
  • map_partition(name)
    • Asigna la partición si aún no lo hiciste.
    • Devuelve la ruta de acceso absoluta del dispositivo de bloques asignado en caso de éxito. o una cadena vacía en caso de error.
  • update_dynamic_partitions(op_list)
    • Aplica la lista de operaciones proporcionada a los metadatos de particiones dinámicas y, si es necesario, anula la asignación de particiones.
    • Muestra t si se realiza correctamente o una cadena vacía si se produce un error.

El argumento op_list para update_dynamic_partitions apunta a un archivo en el paquete de actualización. Cada línea del archivo especifica una operación. Si falla alguna operación, update_dynamic_partitions muestra de inmediato una cadena vacía. Las operaciones son las siguientes:

  • resize partition-name size
    • Anula la asignación de la partición y, luego, cambia su tamaño a size.
  • remove partition_name
    • Desvincula la partición y, luego, quítala.
  • add partition-name group-name
    • Agrega una partición nueva al grupo especificado.
    • Anular si el grupo no existe o si la partición ya no existe existe.
  • move partition-name group-name
    • Mueve la partición al grupo especificado.
    • Anula la suscripción si el grupo no existe o la partición no existe.
  • add_group group-name maximum-size
    • Agrega un grupo con el nombre y el tamaño máximo especificados.
    • Anula la suscripción si el grupo ya existe.
    • Un maximum_size de 0 significa que no hay límites de tamaño. en particiones del grupo. Se requieren pruebas adicionales para asegúrate de que las particiones del grupo no excedan espacio disponible en el dispositivo.
  • resize_group group-name maximum-size
    • Cambia el tamaño del grupo al tamaño máximo especificado.
    • Aborta si el grupo no existe.
    • Un maximum_size de 0 significa que no hay límites de tamaño. en particiones del grupo. Se requieren pruebas adicionales para asegurarnos de que las particiones del grupo no superen el espacio disponible en el dispositivo.
  • remove_group group-name
    • Quitar un grupo
    • Aborta si hay particiones en el grupo.
  • remove_all_groups
    • Desvincula todas las particiones del asignador de dispositivos.
    • Quita todas las particiones y grupos.

OTA incremental

Las actualizaciones OTA incrementales usan la siguiente lógica:

  1. Reducir particiones, borrar particiones o moverlas fuera del grupo (para que haya suficiente espacio para reducir los grupos)
  2. Reducir grupos (de modo que haya suficiente espacio para aumentarlos)
  3. Expandir grupos (para que tengamos suficiente espacio para expandir o agregar particiones)
  4. Aumentar particiones, agregar particiones o mover particiones a un grupo nuevo

En detalle, update-script se genera con lo siguiente: lógica:

for each shrinking partition:
    block_image_update(map_partition(name), …)

update_dynamic_partitions(op_list)

for each growing / adding partition:
    block_image_update(map_partition(name), …)

El archivo op_list para update_dynamic_partitions se genera con esta lógica:

for each deleting partition:
    remove
for each partition that changes groups:
    move to "default"
for each shrinking partition:
    resize
for each shrinking / removing group:
    resize_group / remove_group
for each growing / adding group:
    resize_group / add_group
for each adding partition:
    add
for each growing / adding partition:
    resize
for each partition that changes groups:
    move to target group

OTA completa

Las actualizaciones OTA completas usan la siguiente lógica:

  1. Borra todos los grupos y particiones existentes
  2. Agregar grupos
  3. Cómo agregar particiones

En detalle, update-script se genera con lo siguiente: lógica:

update_dynamic_partitions(op_list)

for each adding partition:
    block_image_update(map_partition(name), …)

El archivo op_list para update_dynamic_partitions se genera con esta lógica:

remove_all_groups
for each adding group:
    add_group
for each adding partition:
    add
for each adding partition:
    resize