Cómo compilar paquetes inalámbricos

Puedes usar la herramienta ota_from_target_files que se proporciona en build/make/tools/releasetools para compilar paquetes OTA completos e incrementales para dispositivos que usan actualizaciones del sistema A/B o actualizaciones del sistema que no son A/B. La herramienta toma el Archivo target-files.zip producido por el sistema de compilación de Android como entrada.

Para dispositivos con Android 11 o versiones posteriores, puedes compilar un paquete inalámbrico para varios dispositivos con diferentes SKU. Para ello, debes configurar los dispositivos de destino de modo que usen huellas dactilares dinámicas y actualizar los metadatos OTA para incluir el nombre y la huella dactilar del dispositivo en las entradas anterior y posterior a la condición.

Android 8.0 dio de baja los paquetes OTA basados en archivos para dispositivos que no son A/B, que en su lugar deben usar paquetes OTA basados en bloques. Para generar paquetes OTA basados en bloques o dispositivos que ejecutan Android 7.x o versiones anteriores, pasa la opción --block al parámetro ota_from_target_files.

Compila actualizaciones completas

Una actualización completa es un paquete inalámbrico que contiene todo el estado final del dispositivo (particiones de sistema, inicio y recuperación). Siempre y cuando el dispositivo sea capaz de recibir y aplicar el paquete, este puede instalar la compilación independientemente del estado actual del dispositivo. Por ejemplo, los siguientes comandos usan herramientas de lanzamiento para compilar el archivo target-files.zip para el dispositivo tardis.

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

make dist compila un paquete inalámbrico completo (en $OUT). El archivo .zip resultante contiene todo lo necesario para compilar paquetes inalámbricos para el dispositivo tardis. También puedes compilar ota_from_target_files como un objeto binario de Python y llamarlo para compilar paquetes completos o incrementales.

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

La ruta de acceso ota_from_target_files se configura en $PATH, y la imagen resultante de Python se encuentra en el directorio out/.

ota_update.zip ya está listo para enviarse a los dispositivos de prueba (todo está firmado con la clave de prueba). Para los dispositivos de los usuarios, genera y usa tus propias claves privadas como se detalla en Cómo firmar compilaciones para el lanzamiento.

Cómo compilar actualizaciones incrementales

Una actualización incremental es un paquete inalámbrico que contiene parches binarios para los datos que ya están en el dispositivo. Los paquetes con actualizaciones incrementales suelen ser más pequeños ya que no necesitan incluir archivos sin modificar. Además, como los archivos modificados suelen ser muy similares a sus versiones anteriores, el paquete solo necesita incluir una codificación de las diferencias entre los dos archivos.

Puedes instalar un paquete de actualización incremental solo en los dispositivos que tengan la Es la compilación de origen que se usa para construir el paquete. Para crear una actualización incremental, necesitas el archivo target_files.zip de la compilación anterior (la que deseas para actualizar from), así como el archivo target_files.zip de la nueva compilación. Por ejemplo, los siguientes comandos usan herramientas de lanzamiento para compilar una actualización incremental para el dispositivo tardis.

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

Esta compilación es muy similar a la anterior, y el paquete de actualización incremental (incremental_ota_update.zip) es mucho más pequeño que la actualización completa correspondiente (alrededor de 1 MB en lugar de 60 MB).

Distribuye un paquete incremental solo a los dispositivos que ejecutan exactamente la misma compilación anterior que se usa como punto de partida del paquete incremental. Debes activar la memoria flash las imágenes en PREVIOUS-tardis-target_files.zip o PREVIOUS-tardis-img.zip (ambas compiladas con make dist, para escribirse en la memoria flash con fastboot update), en lugar de los que están en el directorio PRODUCT_OUT (compilados con make, que serán parpadearon con fastboot flashall). Intenta instalar el paquete incremental en un dispositivo con otra compilación generará un error de instalación. Cuando falla la instalación, el dispositivo permanece en el mismo estado de funcionamiento (ejecutando el sistema anterior). El paquete verifica el estado anterior de todos los archivos que actualiza antes de tocarlos, de modo que el dispositivo no quede en un estado medio actualizado.

Para brindar la mejor experiencia del usuario, ofrece una actualización completa por cada 3 o 4 actualizaciones. Esto ayuda a los usuarios a ponerse al día con la versión más reciente y evitar una larga secuencia de instalación de actualizaciones incrementales.

Crea paquetes inalámbricos para varios SKU

Android 11 y las versiones posteriores admiten el uso de una única OTA para varios dispositivos con diferentes SKU. Para ello, es necesario configurar que los dispositivos de destino usen huellas digitales dinámicas y actualicen los metadatos de OTA (mediante herramientas inalámbricas) para incluir el nombre del dispositivo y la huella digital en la parte previa y posterior condiciones.

Acerca de los SKU

El formato de un SKU es una variación de los valores combinados del parámetro de compilación y, por lo general, es un subconjunto no declarado de los parámetros build_fingerprint actuales. Los OEMs pueden usar cualquier combinación de parámetros de compilación aprobados por la CDD para un SKU y, al mismo tiempo, usar una sola imagen para esos SKU. Por ejemplo, el siguiente SKU tiene múltiples variaciones:

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA es el nivel del dispositivo (como Pro, Premium o Plus)
  • modifierB es la variación de hardware (como la radio).
  • modifierC es la región, que puede ser general (como NA, EMEA o CHN) o específica de un país o idioma (como JPN, ENG o CHN).

Muchos OEM usan una sola imagen para varios SKU y, luego, derivan el producto final. y la huella digital del dispositivo en el tiempo de ejecución, luego de que se inicie el dispositivo. Este proceso simplifica el proceso de desarrollo de la plataforma, lo que permite que los dispositivos personalizaciones, pero diferentes nombres de productos para compartir imágenes comunes (como tardis y tardispro).

Usa huellas dactilares dinámicas

Una huella digital es una concatenación definida de parámetros de compilación, como ro.product.brand, ro.product.name y ro.product.device. La huella digital de un dispositivo se deriva de la huella digital de la partición del sistema y se usa como identificador único de las imágenes (y bytes) que se ejecutan en el dispositivo. Para crear una huella dactilar dinámica, usa lógica dinámica en el archivo build.prop del dispositivo para obtener el valor de las variables del bootloader en el momento del inicio del dispositivo y, luego, usa esos datos para crear una huella dactilar dinámica para ese dispositivo.

Por ejemplo, para usar huellas digitales dinámicas para dispositivos tardis y tardispro, actualiza los siguientes archivos como se muestra a continuación.

  • Actualiza el archivo odm/etc/build_std.prop para que contenga la siguiente línea.

    ro.odm.product.device=tardis
    
  • Actualiza el archivo odm/etc/build_pro.prop para que contenga la siguiente línea.

    ro.odm.product.device=tardispro
    
  • Actualiza el archivo odm/etc/build.prop para que contenga las siguientes líneas.

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

Estas líneas establecen de forma dinámica el nombre del dispositivo, la huella digital y los valores de ro.build.fingerprint según el valor de la propiedad del bootloader ro.boot.product.hardware.sku (que es de solo lectura).

Actualiza los metadatos del paquete OTA

Un paquete inalámbrico contiene un archivo de metadatos (META-INF/com/android/metadata) que describe el paquete, incluida la condición previa y posterior del envío de OTA . Por ejemplo, el siguiente código es el archivo de metadatos de un paquete inalámbrico orientadas al dispositivo tardis.

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

Los valores pre-device, pre-build-incremental y pre-build definen la el estado que debe tener un dispositivo antes de que se pueda instalar el paquete inalámbrico. Los valores post-build-incremental y post-build definen el estado que se espera que tenga un dispositivo después de instalar el paquete inalámbrico. Los valores de los campos pre- y post- se derivan de las siguientes propiedades de compilación correspondientes.

  • El valor de pre-device se deriva de la propiedad de compilación ro.product.device.
  • Los valores pre-build-incremental y post-build-incremental se derivan de la propiedad de compilación ro.build.version.incremental.
  • Los valores pre-build y post-build se derivan de la propiedad de compilación ro.build.fingerprint.

En dispositivos con Android 11 o versiones posteriores, puedes usar la marca --boot_variable_file en las herramientas OTA para especificar una ruta de acceso a un archivo que contiene los valores de las variables de tiempo de ejecución que se usan para crear la huella digital dinámica del dispositivo. Luego, los datos se usan para actualizar los metadatos OTA para incluir el nombre y la huella dactilar del dispositivo en las condiciones pre- y post- (con el carácter barra | como delimitador). La marca --boot_variable_file tiene la siguiente sintaxis y descripción.

  • Sintaxis: --boot_variable_file <path>
  • Descripción: Especifica una ruta de acceso a un archivo que contiene los valores posibles de las propiedades ro.boot.*. Se usa para calcular las posibles huellas digitales del entorno de ejecución cuando la sentencia de importación anula algunas propiedades ro.product.*. El archivo espera una propiedad por línea, en la que cada línea tiene el siguiente formato: prop_name=value1,value2.

Por ejemplo, cuando la propiedad es ro.boot.product.hardware.sku=std,pro, los metadatos OTA para los dispositivos tardis y tardispro son como se muestra a continuación.

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

Para admitir esta funcionalidad en dispositivos que ejecutan Android 10, consulta la implementación de referencia. Esta lista de cambios analiza condicionalmente las sentencias import en build.prop. , que permite reconocer anulaciones de propiedades y reflejarlas en la metadatos finales de OTA.