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.

Não há suporte para versões de imagem mistas nos seguintes casos:

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

  • Sanitizer. Os snapshots de fornecedor e VNDK não são compatíveis com o saneador, já que as variantes precisam ser criadas separadamente.

Sobre snapshots do fornecedor

Um snapshot do fornecedor é um snapshot 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 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 snapshot 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 seguintes diretórios 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 snapshots do fornecedor não são compatíveis com essas configurações.

Criar snapshots de fornecedores

Crie um snapshot 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 snapshot 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 vintf_fragments.
  • O diretório configs contém arquivos .rc e .xml das flags init_rc e vintf_fragments.

Instalar snapshots do fornecedor

Para instalar um snapshot 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ó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)

Criar imagens de fornecedores

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 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 snapshot substitui um módulo de origem em C++ com o mesmo nome.
  • Define ro.vndk.version como BOARD_VNDK_VERSION.
  • Instala módulos de snapshot do VNDK de BOARD_VNDK_VERSION a system_ext.