Gerar snapshots do fornecedor

O Android 11 oferece suporte a artefatos de build de instantâneos do VNDK e instantâneos do fornecedor, que podem ser usados para criar vendor.img, independente da versão do Android na árvore de origem. Isso permite versões mistas de imagens, como um fornecedor antigo e uma imagem do sistema mais recente.

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

  • Android.mk. Como o Soong gera o instantâneo do fornecedor, os módulos definidos em Android.mk não são capturados como um instantâneo do fornecedor. Os módulos proprietários do SoC em Android.mk também não têm garantia de funcionamento.

  • Sanitizador. Os instantâneos do fornecedor e do VNDK não oferecem suporte ao sanitizador, porque as variantes do sanitizador precisam ser criadas separadamente.

Sobre os instantâneos do fornecedor

Um instantâneo do fornecedor é um instantâneo de propriedade do OEM. É um conjunto de módulos C++ pré-criados instalados em /vendor, mas mantidos no AOSP. Sem capturar um instantâneo do fornecedor da versão anterior do Android, a atualização para uma nova versão do Android pode interromper a partição do fornecedor, porque os módulos de instantâneo do fornecedor podem ser removidos ou alterados sem compatibilidade de 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 do VNDK com vendor_available: true
  • Executáveis e arquivos de 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
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

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

Criar instantâneos do fornecedor

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 a seguir 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 flags, 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 das flags init_rc e vintf_fragments.

Instalar instantâneos 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

Esse comando gera /vendor/vendor name/vendor_snapshot/vVER/$(TARGET_ARCH)/Android.bp. O exemplo a seguir mostra a estrutura de diretório de um instantâneo 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)

Criar imagens do fornecedor

Usando artefatos de build de instantâneos do VNDK e um instantâneo do fornecedor, é possível criar vendor.img, independente da versão do Android na árvore de origem, o que permite criar versões mistas de imagens. Depois de instalar o instantâneo do VNDK e o instantâneo do fornecedor, defina BOARD_VNDK_VERSION como a versão do fornecedor. Exemplo:

# BoardConfig.mk
BOARD_VNDK_VERSION := 29

Quando BOARD_VNDK_VERSION é definido como um valor diferente de current, o sistema de build:

  • Ativa os módulos de instantâneo do VNDK e os módulos de instantâneo 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 instantâneo do VNDK de BOARD_VNDK_VERSION em system_ext.