Gerando instantâneos de fornecedores

O Android 11 oferece suporte a artefatos de criação de snapshots do VNDK e snapshots de fornecedores, que você pode usar para criar vendor.img independentemente da versão do Android na árvore de origem. Isso permite versões mistas de imagens, como um fornecedor mais antigo e uma imagem de sistema mais recente.

Versões de imagens mistas não são compatíveis com o seguinte.

  • Android.mk. Como o Soong gera o snapshot do fornecedor, os módulos definidos no Android.mk não são capturados como um snapshot do fornecedor (os módulos proprietários do SoC no Android.mk também não têm garantia de funcionamento).

  • Desinfetante. Os snapshots do fornecedor e do VNDK não são compatíveis com o sanitizador, pois as variantes do sanitizador precisam ser criadas separadamente.

Sobre snapshots de fornecedores

Um snapshot do fornecedor é um snapshot de propriedade do OEM. É um conjunto de módulos C++ pré-construídos instalados em /vendor , mas mantidos no AOSP. Sem capturar um snapshot do fornecedor da versão anterior do Android, a atualização para uma nova versão do Android pode quebrar a partição do fornecedor porque os módulos de snapshot do fornecedor podem ser removidos ou alterados sem compatibilidade com API ou ABI.

Um instantâneo do fornecedor contém os seguintes módulos no AOSP.

  • Bibliotecas compartilhadas, estáticas e de cabeçalho com vendor: true ou vendor_available: true
  • Bibliotecas estáticas VNDK com vendor_available: true
  • Executáveis ​​e arquivos objeto com vendor: true ou vendor_available: true

Os módulos nos diretórios a seguir são considerados código de hardware de propriedade do SoC e são ignorados.

  • device/
  • vendor/
  • hardware/ , exceto para
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

Os códigos de hardware de propriedade do SoC também podem existir em outros diretórios. Neste momento, os instantâneos do fornecedor não suportam tais configurações.

Criando instantâneos de fornecedores

Crie um instantâneo do fornecedor usando os comandos a seguir.

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

Esses comandos criam um arquivo vendor-$(TARGET_DEVICE).zip em $DIST_DIR . O exemplo abaixo mostra um arquivo ZIP de instantâneo do fornecedor.

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
  • Os arquivos JSON contêm sinalizadores como nome do módulo, diretórios exportados, arquivos init_rc e arquivos vintf_fragments .
  • O diretório configs contém arquivos .rc e .xml dos sinalizadores init_rc e vintf_fragments .

Instalando snapshots do fornecedor

Para instalar um instantâneo do fornecedor, navegue até o diretório de destino e use os comandos a seguir.

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

Este comando gera /vendor/ vendor name /vendor_snapshot/v VER /$(TARGET_ARCH)/Android.bp . O exemplo a seguir mostra a estrutura de diretórios de um snapshot do fornecedor.

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)

Criação de imagens de fornecedores

Usando artefatos de criação de snapshot do VNDK e um snapshot do fornecedor, você pode criar vendor.img independentemente da versão do Android na árvore de origem, possibilitando a criação de versões mistas de imagens. Depois de instalar o snapshot do VNDK e o snapshot do fornecedor, defina BOARD_VNDK_VERSION como a versão do fornecedor. Por exemplo:

# BoardConfig.mk
BOARD_VNDK_VERSION := 29

Quando BOARD_VNDK_VERSION é definido com um valor diferente de current , o sistema de compilação:

  • Ativa módulos de snapshot do VNDK e módulos de snapshot do fornecedor de BOARD_VNDK_VERSION . Cada módulo de instantâneo substitui um módulo de origem C++ com o mesmo nome.
  • Define ro.vndk.version como BOARD_VNDK_VERSION .
  • Instala módulos de snapshot VNDK de BOARD_VNDK_VERSION em system_ext .