Générer des instantanés des fournisseurs

Android 11 est compatible avec les artefacts de compilation d'instantanés VNDK et les instantanés de fournisseurs, que vous pouvez utiliser pour compiler vendor.img, quelle que soit la version d'Android dans l'arborescence source. Cela permet d'utiliser des versions mixtes d'images, comme une ancienne image du fournisseur et une image système plus récente.

Les versions d'image mixtes ne sont pas acceptées pour les éléments suivants :

  • Android.mk. Étant donné que Soong génère le snapshot du fournisseur, les modules définis dans Android.mk ne sont pas capturés en tant que snapshot du fournisseur (les modules propriétaires du SoC dans Android.mk ne sont pas non plus garantis de fonctionner).

  • Désinfectant : Les snapshots Vendor et VNDK ne sont pas compatibles avec le vérificateur, car les variantes de vérificateur doivent être compilées séparément.

À propos des instantanés de fournisseur

Un instantané du fournisseur est un instantané appartenant à l'OEM. Il s'agit d'un ensemble de modules C++ prédéfinis installés dans /vendor, mais gérés sur AOSP. Si vous ne capturez pas d'instantané du fournisseur de la version Android précédente, la mise à niveau vers une nouvelle version d'Android risque de casser la partition du fournisseur, car les modules d'instantané du fournisseur peuvent être supprimés ou modifiés sans compatibilité API ni ABI.

Un instantané du fournisseur contient les modules suivants sur AOSP.

  • Bibliothèques partagées, statiques et d'en-tête avec vendor: true ou vendor_available: true
  • Bibliothèques statiques VNDK avec vendor_available: true
  • Fichiers exécutables et objets avec vendor: true ou vendor_available: true

Les modules situés dans les répertoires suivants sont considérés comme du code matériel appartenant au SoC et sont ignorés.

  • device/
  • vendor/
  • hardware/, sauf
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

Il est également possible que des codes matériels appartenant à des SoC existent dans d'autres répertoires. Pour le moment, les instantanés du fournisseur ne sont pas compatibles avec ces configurations.

Créer des instantanés de fournisseur

Créez un instantané du fournisseur à l'aide des commandes suivantes.

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

Ces commandes créent un fichier vendor-$(TARGET_DEVICE).zip dans $DIST_DIR. L'exemple suivant montre un fichier ZIP d'instantané du fournisseur :

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
  • Les fichiers JSON contiennent des indicateurs tels que le nom du module, les répertoires exportés, les fichiers init_rc et les fichiers vintf_fragments.
  • Le répertoire configs contient les fichiers .rc et .xml des indicateurs init_rc et vintf_fragments.

Installer les instantanés du fournisseur

Pour installer un instantané du fournisseur, accédez au répertoire de destination et utilisez les commandes suivantes.

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

Cette commande génère /vendor/vendor name/vendor_snapshot/vVER/$(TARGET_ARCH)/Android.bp. L'exemple suivant montre la structure de répertoire d'un instantané du fournisseur :

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)

Créer des images de fournisseur

En utilisant les artefacts de compilation d'instantané VNDK et un instantané du fournisseur, vous pouvez compiler vendor.img quelle que soit la version d'Android dans l'arborescence source, ce qui permet de créer des versions mixtes d'images. Après avoir installé l'instantané VNDK et l'instantané du fournisseur, définissez BOARD_VNDK_VERSION sur la version du fournisseur. Exemple :

# BoardConfig.mk
BOARD_VNDK_VERSION := 29

Lorsque BOARD_VNDK_VERSION est défini sur une valeur autre que current, le système de compilation :

  • Active les modules d'instantané VNDK et les modules d'instantané du fournisseur de BOARD_VNDK_VERSION. Chaque module d'instantané remplace un module source C++ portant le même nom.
  • Définit ro.vndk.version sur BOARD_VNDK_VERSION.
  • Installe les modules d'instantané VNDK de BOARD_VNDK_VERSION à system_ext.