Generación de instantáneas de proveedores

Android 11 admite artefactos de compilación de instantáneas VNDK e instantáneas de proveedores, que puede usar para compilar vendor.img independientemente de la versión de Android en el árbol de origen. Esto permite versiones mixtas de imágenes, como un proveedor anterior y una imagen de sistema más nueva.

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

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

  • Desinfectante. Las instantáneas de proveedores y VNDK no son compatibles con el desinfectante, ya que las variantes del desinfectante deben compilarse por separado.

Acerca de las instantáneas de proveedores

Una instantánea del proveedor es una instantánea propiedad del OEM. Es un conjunto de módulos C++ precompilados instalados en /vendor pero mantenidos en AOSP. Sin capturar una instantánea del proveedor de la versión anterior de Android, la actualización a una nueva versión de Android podría romper la partición del proveedor porque los módulos de instantáneas del proveedor se pueden quitar o cambiar sin compatibilidad con API o ABI.

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

  • Bibliotecas compartidas, estáticas y de encabezado con vendor: true o vendor_available: true
  • Bibliotecas estáticas VNDK con vendor_available: true
  • Ejecutables y archivos de objeto con vendor: true o vendor_available: true

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

  • device/
  • vendor/
  • hardware/ , a excepción de
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

Los códigos de hardware propiedad de SoC también pueden existir en otros directorios. En este momento, las instantáneas de proveedores no admiten tales configuraciones.

Creación de instantáneas de proveedores

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

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

Estos comandos crean un archivo de vendor-$(TARGET_DEVICE).zip en $DIST_DIR . El siguiente ejemplo muestra un archivo ZIP de instantáneas de un 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 indicadores como el nombre del módulo, los directorios exportados, los archivos init_rc y los archivos vintf_fragments .
  • El directorio de configs contiene archivos .rc y .xml de los indicadores init_rc y vintf_fragments .

Instalación de instantáneas de proveedores

Para instalar una instantánea del proveedor, navegue hasta el directorio de destino y use 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/v VER /$(TARGET_ARCH)/Android.bp . El siguiente ejemplo muestra la estructura de directorios de una instantánea de 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)

Creación de imágenes de proveedores

Con los artefactos de compilación de instantáneas de VNDK y una instantánea de proveedor, puede compilar vendor.img independientemente de la versión de Android en el árbol de origen, lo que hace posible crear versiones mixtas de imágenes. Después de instalar tanto la instantánea de VNDK como la instantánea del proveedor, establezca 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 diferente al current , el sistema de compilación:

  • 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 fuente de C++ que tiene el mismo nombre.
  • Establece ro.vndk.version en BOARD_VNDK_VERSION .
  • Instala módulos de instantáneas VNDK de BOARD_VNDK_VERSION en system_ext .