Genera instantáneas de los proveedores

Android 11 admite artefactos de compilación de resúmenes de VNDK y instantáneas de proveedores, que puedes usar para compilar vendor.img sin importar la versión de Android que uses en el árbol fuente. De esta manera, puedes usar versiones de imágenes combinadas (por ejemplo, una imagen del sistema nueva y una de un proveedor anterior).

Las versiones de imágenes mixtas no son compatibles con lo siguiente:

  • Android.mk. Debido a que Soong genera la instantánea del proveedor, los módulos definidos en Android.mk no se capturan como una instantánea del proveedor (tampoco se garantiza que funcionen los módulos propietarios de SoC en Android.mk).

  • Limpia. Las instantáneas del proveedor y del VNDK no admiten el sanitizador, ya que las variantes del sanitizador deben compilarse por separado.

Acerca de los resúmenes de proveedores

Una instantánea del proveedor es una instantánea que pertenece al OEM. Es un conjunto de módulos C++ precompilados que se instalan en /vendor, pero se mantienen en AOSP. Si no se captura una instantánea del proveedor de la versión anterior de Android, la actualización a una versión nueva de Android podría dañar la partición del proveedor, ya que los módulos de instantáneas del proveedor se pueden quitar o cambiar sin compatibilidad con la API o ABI.

Una instantánea del proveedor contiene los siguientes módulos en AOSP.

  • Bibliotecas compartidas, estáticas y de encabezados con vendor: true o vendor_available: true
  • Bibliotecas estáticas del VNDK con vendor_available: true
  • Archivos ejecutables y de objetos con vendor: true o vendor_available: true

Los módulos de los siguientes directorios se consideran código de hardware propiedad del SoC y se ignoran.

  • device/
  • vendor/
  • hardware/, excepto por
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

Es posible que los códigos de hardware propiedad del SoC también existan en otros directorios. Por el momento, las instantáneas del proveedor no admiten esas configuraciones.

Compila instantáneas de los proveedores

Compila una instantánea del proveedor con los siguientes comandos.

. build/envsetup.sh
lunch target
m dist vendor-snapshot

Estos comandos crean un archivo vendor-$(TARGET_DEVICE).zip en $DIST_DIR. En el siguiente ejemplo, se muestra un archivo ZIP de instantáneas del proveedor:

vendor-$(TARGET_DEVICE).zip
├── arch-arm64-armv8-a
│   ├── binary         -> binary files, *.json files
│   ├── header         -> *.json files
│   ├── object         -> *.o files, *.json files
│   ├── shared         -> *.so files, *.json files
│   └── static         -> *.a files, *.json files
├── arch-arm-armv8-a   -> (arch-arm64-armv8-a)
├── configs            -> *.rc files, *.xml files
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files
  • Los archivos JSON contienen marcas, como el nombre del módulo, los directorios exportados, los archivos init_rc y los archivos vintf_fragments.
  • El directorio configs contiene archivos .rc y .xml de las marcas init_rc y vintf_fragments.

Instala instantáneas de proveedores

Para instalar una instantánea del proveedor, navega al directorio de destino y usa los siguientes comandos.

python3 development/vendor_snapshot/update.py --local $DIST_DIR --install-dir \
    vendor/vendor name/vendor_snapshot VER

Este comando genera /vendor/vendor name/vendor_snapshot/vVER/$(TARGET_ARCH)/Android.bp. En el siguiente ejemplo, se muestra la estructura de directorios de una instantánea del proveedor:

vendor/vendor name/vendor_snapshot/
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a
│   │   │   ├── binary         -> (prebuilt libs)
│   │   │   ├── object         -> (prebuilt libs)
│   │   │   ├── shared         -> (prebuilt libs)
│   │   │   └── static         -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (same as above)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (snapshot modules)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   └── x86                    -> (same as above)
└── (other vendor versions)    -> (same as above)

Compila imágenes de proveedores

Con los artefactos de compilación de resúmenes de VNDK y una instantánea del proveedor, puedes compilar vendor.img sin importar la versión de Android en el árbol fuente, lo que permite crear versiones mixtas de imágenes. Después de instalar la instantánea del VNDK y la del proveedor, configura BOARD_VNDK_VERSION en la versión del proveedor. Por ejemplo:

# BoardConfig.mk
BOARD_VNDK_VERSION := 29

Cuando BOARD_VNDK_VERSION se establece en un valor distinto de current, el sistema de compilación hace lo siguiente:

  • Habilita los módulos de instantáneas de VNDK y los módulos de instantáneas de proveedores de BOARD_VNDK_VERSION. Cada módulo de instantánea anula un módulo de origen de C++ que tiene el mismo nombre.
  • Establece ro.vndk.version en BOARD_VNDK_VERSION.
  • Instala módulos de instantáneas del VNDK de BOARD_VNDK_VERSION a system_ext.