En esta página, se describen los cambios que se agregaron a AOSP para reducir los cambios innecesarios de archivos entre compilaciones. Los implementadores de dispositivos que mantienen sus propios sistemas de compilación pueden usar esta información como guía. para reducir el tamaño de sus actualizaciones inalámbricas.
En ocasiones, las actualizaciones inalámbricas de Android contienen archivos modificados que no corresponden a cambios de código. En realidad, son artefactos del sistema de compilación. Esto puede ocurrir cuando el mismo código, compilado en diferentes en diferentes directorios o en diferentes máquinas produce una gran cantidad de cambios archivos. Estos archivos excesivos aumentan el tamaño de un parche inalámbrico y dificultan la determinación qué código cambió.
Para que el contenido de una OTA sea más transparente, AOSP incluye cambios de sistema de compilación diseñados para reducir el tamaño de los parches inalámbricos. Se realizaron cambios innecesarios de archivos entre compilaciones y solo los archivos relacionados con parches se incluyen en las actualizaciones OTA. AOSP también incluye Herramienta de diferencias de compilación, que filtra las opciones comunes relacionadas con compilaciones cambios en los archivos para proporcionar una diferencia más clara del archivo de compilación y un herramienta de asignación de bloques, que ayuda a mantener la asignación de bloques coherentes.
Un sistema de compilación puede crear parches innecesariamente grandes de varias maneras. Para mitigar esto, en En Android 8.0 y versiones posteriores, se implementaron nuevas funciones para reducir el tamaño del parche para cada diferencia del archivo Entre las mejoras que se redujeron los tamaños de los paquetes de actualizaciones OTA, se incluyen las siguientes:
-
El uso de ZSTD, un algoritmo de compresión sin pérdida de uso genérico para
en actualizaciones de dispositivos que no sean A/B. ZSTD se puede personalizar para valores mayores
las proporciones de compresión aumentando el nivel de compresión. El nivel de compresión se establece durante OTA
de generación de demanda y se puede establecer pasando la marca
--vabc_compression_param=zstd,$COMPRESSION_LEVEL
-
Aumentar el tamaño de la ventana de compresión que se usa durante la actualización inalámbrica El tamaño máximo de ventana de compresión
Para ello, se puede personalizar el parámetro de compilación en el archivo
.mk
de un dispositivo. Esta variable se establece comoPRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 262144
. - Uso de la recompresión Puffin, una herramienta de aplicación de parches determinista para la desinflación. , que controla las funciones de compresión y diferenciación para la generación de actualizaciones A/B OTA.
-
Los cambios en el uso de la herramienta de generación delta, como la forma
bsdiff
para comprimir parches. En Android 9 y versiones posteriores, la La herramientabsdiff
selecciona el algoritmo de compresión que le daría obtener los mejores resultados de compresión para un parche. -
Mejoras en la
update_engine
se consumió menos memoria al aplicar parches para las actualizaciones A/B de los dispositivos.
En las siguientes secciones, se analizan varios problemas que afectan los tamaños de las actualizaciones OTA, y ejemplos de implementación en el AOSP.
Orden de archivos
Problema: Los sistemas de archivos no garantizan un orden de archivos cuando se les solicita una lista de archivos.
en un directorio, aunque suele ser lo mismo para la misma confirmación de la compra. Herramientas como
ls
ordena los resultados de forma predeterminada, pero la función comodín que usan los comandos como
ya que find
y make
no ordenan. Antes de usar estas herramientas, debes ordenar
los resultados.
Solución: Cuando usas herramientas como find
y
make
con la función comodín, ordena el resultado de estos comandos antes de usarlos
de ellos. Cuando uses $(wildcard)
o $(shell find)
en
Android.mk
, ordénalos también. Algunas herramientas, como Java, ordenan las entradas, por lo que
Antes de ordenar los archivos, verifica que la herramienta que estás usando aún no lo haya hecho.
Ejemplos: Muchas instancias se corrigieron en el sistema de compilación principal con la
macro all-*-files-under
integrada, que incluye
all-cpp-files-under
(ya que varias definiciones se distribuyeron en otros archivos makefile).
Para obtener más detalles, consulta lo siguiente:
- https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f
- https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410
- https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653
- https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c
Directorio de compilación
Problema: Cambiar el directorio en el que se compilan los elementos puede causar la
binarios diferentes. La mayoría de las rutas de acceso
en la compilación de Android son relativas
__FILE__
en C/C++ no es un problema. Sin embargo, los símbolos de depuración codifican el
de ruta de acceso de forma predeterminada, y .note.gnu.build-id
se genera a partir de la generación de hash del
binario eliminado previamente, por lo que cambiará si cambian los símbolos de depuración.
Solución: El AOSP ahora hace relativas las rutas de depuración. Para obtener más información, consulta CL: https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02.
Marcas de tiempo
Problema: Las marcas de tiempo en el resultado de la compilación generan cambios innecesarios en los archivos. Es probable que esto suceda en las siguientes ubicaciones:
- Macros
__DATE__/__TIME__/__TIMESTAMP__
en código C o C++. - Marcas de tiempo incorporadas en archivos basados en ZIP.
Soluciones/ejemplos: Para quitar marcas de tiempo del resultado de la compilación, usa el instrucciones que se proporcionan a continuación en __DATE__/__TIME__/__TIMESTAMP__ en C/C++ y Marcas de tiempo incorporadas en archivos.
__DATE__/__TIME__/__TIMESTAMP__ en C/C++
Estas macros siempre producen resultados diferentes para compilaciones diferentes, así que no las uses. Aquí hay algunas opciones para eliminar estas macros:
- Quítalas. Para ver un ejemplo, consulta https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f.
- Para identificar de forma exclusiva el objeto binario en ejecución, lee el ID de compilación del encabezado ELF.
-
Para saber cuándo se compiló el SO, lee el
ro.build.date
(funciona para todo, excepto las compilaciones incrementales, que pueden no actualizar esta fecha). Por ejemplo, consulta a https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84.
Marcas de tiempo incorporadas en archivos (zip, jar)
Android 7.0 solucionó el problema de marcas de tiempo incorporadas en archivos zip agregando
-X
para todos los usos del comando zip
. Esto quitó el UID/GID del
y la marca de tiempo extendida de Unix del archivo ZIP.
Una nueva herramienta, ziptime
(ubicada en
/platform/build/+/main/tools/ziptime/
) restablece las marcas de tiempo normales en los encabezados ZIP. Para obtener más información, consulta la
README.
La herramienta signapk
establece marcas de tiempo para los archivos APK que pueden variar según el
la zona horaria del servidor. Para obtener más información, consulta la CL.
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028.
La herramienta signapk
establece marcas de tiempo para los archivos APK que pueden variar según el
la zona horaria del servidor. Para obtener más información, consulta la CL.
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028.
Cadenas de la versión
Problema: Las cadenas de la versión del APK a menudo incluían el elemento BUILD_NUMBER
.
a sus versiones codificadas. Incluso si nada más cambia en un APK, como resultado, el APK
seguirán siendo diferentes.
Solución: Quita el número de compilación de la string de versión del APK.
Ejemplos:
- https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27
- https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c
Habilita el procesamiento de verity en el dispositivo
Si dm-verity esté habilitada en el dispositivo, las herramientas inalámbricas tomarán automáticamente tu configuración de verity habilitar el procesamiento de verity en el dispositivo. Esto permite que los bloques de verity se calculen en Android en lugar de almacenarse como bytes sin procesar en tu paquete inalámbrico. Los bloques de verity pueden usar aproximadamente 16 MB para una partición de 2 GB.
Sin embargo, el procesamiento de la veridad en el dispositivo puede llevar mucho tiempo. En específico, la capa Forward
El código de corrección de errores puede tardar mucho tiempo. En los dispositivos Pixel, suele tardar hasta 10
minutos. En dispositivos de gama baja, podría tardar más. Si quieres inhabilitar la verity en el dispositivo
pero aún habilitar dm-verity, puedes hacerlo pasando
--disable_fec_computation
a la herramienta de ota_from_target_files
cuando
generar una actualización OTA. Esta marca inhabilita el cálculo de verity en el dispositivo durante las actualizaciones OTA.
Reduce el tiempo de instalación inalámbrica, pero aumenta el tamaño del paquete inalámbrico. Si tu dispositivo no
tienen dm-verity habilitado, pasar esta marca no tiene ningún efecto.
Herramientas de compilación coherentes
Problema: Las herramientas que generan archivos instalados deben ser coherentes (un siempre debería producir el mismo resultado).
Soluciones/ejemplos: Se requerían cambios en las siguientes herramientas de compilación:
- AVISO creador del archivo. Se cambió el creador del archivo CUSTOMER que creó colecciones de AVISO reproducibles. Consulta CL: https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64.
- Java Android Compiler Kit (Jack). La cadena de herramientas Jack requería una actualización para controlar cambios ocasionales en el orden del constructor generado Descriptores de acceso deterministas para se agregaron constructores a la cadena de herramientas: https://android.googlesource.com/toolchain/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b.
- Compilador AOT de ART (dex2oat) El binario del compilador de ART recibió una actualización que se agregó una opción para crear una imagen determinista: https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9.
-
El archivo libpac.so (V8). Cada compilación crea un
/system/lib/libpac.so
porque la instantánea V8 cambia para cada compilación. El era quitar la instantánea: https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29. - Archivos de pre-dexopt (.odex) de la aplicación. Los archivos pre-dexopt (.odex) contenían relleno no inicializado en sistemas de 64 bits. Esto se corrigió: https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029.
Cómo usar la herramienta de diferencias de compilación
En los casos en los que no es posible eliminar los cambios en los archivos relacionados con la compilación, el AOSP incluye un
herramienta de diferencias de compilación,
target_files_diff.py
para comparar dos paquetes de archivos. Esta herramienta realiza una diferencia recurrente entre dos
sin incluir los cambios de archivo comunes relacionados con las compilaciones, como
- Cambios esperados en el resultado de la compilación (por ejemplo, debido a un cambio en el número de compilación)
- Cambios debido a problemas conocidos en el sistema de compilación actual.
Para usar la herramienta de diferencias de compilación, ejecuta el siguiente comando:
target_files_diff.py dir1 dir2
dir1
y dir2
son directorios base que contienen el destino extraído.
archivos para cada compilación.
Mantén la coherencia de la asignación de bloques
Para un archivo determinado, si bien su contenido sigue siendo el mismo entre dos compilaciones, los bloques reales que contienen los datos pueden haber cambiado. Como resultado, el actualizador debe realizar operaciones de E/S innecesarias para mover los bloques y realizar una actualización inalámbrica.
En una actualización inalámbrica A/B virtual, las operaciones de E/S innecesarias pueden aumentar en gran medida el espacio de almacenamiento necesario para almacenar la instantánea de la copia en escritura. En una actualización inalámbrica que no es A/B, mover los bloques para obtener un La actualización OTA contribuye al tiempo de actualización, ya que hay más E/S debido a movimientos de bloqueo.
Para solucionar este problema, en Android 7.0, Google extendió la herramienta make_ext4fs
a
y mantener la coherencia de la asignación de bloques en todas las compilaciones La herramienta make_ext4fs
acepta
una marca opcional -d base_fs
que intenta asignar archivos a los mismos bloques
cuando se genera una imagen ext4
. Puedes extraer los archivos de asignación de bloques (como
los archivos de mapa base_fs
) de los archivos de destino de una compilación anterior ZIP. Por cada
ext4
, hay un archivo .map
en el archivo
IMAGES
(por ejemplo, IMAGES/system.map
corresponde a la
system
). Esos base_fs
archivos luego podrán registrarse y
especificadas a través de PRODUCT_<partition>_BASE_FS_PATH
, como en este ejemplo:
PRODUCT_SYSTEM_BASE_FS_PATH := path/to/base_fs_files/base_system.map PRODUCT_SYSTEM_EXT_BASE_FS_PATH := path/to/base_fs_files/base_system_ext.map PRODUCT_VENDOR_BASE_FS_PATH := path/to/base_fs_files/base_vendor.map PRODUCT_PRODUCT_BASE_FS_PATH := path/to/base_fs_files/base_product.map PRODUCT_ODM_BASE_FS_PATH := path/to/base_fs_files/base_odm.map
Si bien esto no ayuda a reducir el tamaño general del paquete inalámbrico, sí mejora reduciendo la cantidad de E/S. En el caso de las actualizaciones A/B virtuales, reduce drásticamente el la cantidad de espacio de almacenamiento necesaria para aplicar la OTA.
Evita actualizar apps
Además de minimizar las diferencias de compilación, puedes reducir el tamaño de las actualizaciones OTA excluyendo las actualizaciones para las apps que reciben actualizaciones a través de tiendas de aplicaciones. Los APK a menudo son una parte importante varias particiones en un dispositivo. Se incluyen las versiones más recientes de apps que se actualizan por app de almacenamiento OTA pueden tener un gran impacto en los paquetes OTA y proporcionar se beneficien. Para cuando los usuarios reciban un paquete inalámbrico, es posible que ya tengan la app actualizada. una versión aún más reciente, recibida directamente de las tiendas de aplicaciones.