O VNDK requer várias alterações em uma base de código para separar as preocupações entre o fornecedor e o sistema. Use o guia a seguir para habilitar o VNDK em uma base de código de fornecedor/OEM.
Crie bibliotecas do sistema
O sistema de compilação contém vários tipos de objetos, incluindo bibliotecas (compartilhadas, estáticas ou de cabeçalho) e binários.

- bibliotecas
coresão usadas pela imagem do sistema, na imagem do sistema. Essas bibliotecas não podem ser usadas pelas bibliotecasvendor,vendor_available,vndkouvndk-sp.cc_library { name: "libThatIsCore", ... } - bibliotecas
vendor-only(ouproprietary) são usadas pela imagem do fornecedor, na imagem do fornecedor.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... } - As bibliotecas
vendor_availablesão usadas pela imagem do fornecedor, na imagem do fornecedor (pode conter duplicatas docore).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... } - As bibliotecas
vndksão usadas pela imagem do fornecedor, na imagem do sistema.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... } - As bibliotecas
vndk-spsão usadas pela imagem do fornecedor e também pela imagem do sistema indiretamente.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... } - As bibliotecas
llndksão usadas pelas imagens do sistema e do fornecedor.llndk_library { name: "libThatIsLlndk", }
Quando uma lib é marcada como vendor_available:true , ela é construída duas vezes:
- Uma vez para plataforma (e, portanto, instalado em
/system/lib) - Uma vez para fornecedor (e, portanto, instalado em
/vendor/libou VNDK APEX)
As versões do fornecedor de libs são construídas com -D__ANDROID_VNDK__ . Os componentes do sistema privado que podem mudar significativamente em versões futuras do Android são desabilitados com esse sinalizador. Além disso, bibliotecas diferentes exportam um conjunto diferente de cabeçalhos (como liblog ). As opções específicas de uma variante de fornecedor de um destino podem ser especificadas em um arquivo Android.bp em:
target: { vendor: { … } }Habilitando o VNDK para uma base de código
Para habilitar o VNDK para uma base de código:
- Determine a elegibilidade calculando os tamanhos necessários das partições
vendor.imgesystem.img. - Ative
BOARD_VNDK_VERSION=current. Você pode adicionar aoBoardConfig.mkou construir componentes diretamente com ele (por exemplo,m -j BOARD_VNDK_VERSION=current MY-LIB).
Depois de habilitar BOARD_VNDK_VERSION=current , o sistema de compilação impõe os seguintes requisitos de dependência e cabeçalho.
Gerenciando dependências
Um objeto vendor que depende de um componente core que não existe no vndk ou como um objeto de vendor deve ser resolvido usando uma das seguintes opções:
- A dependência pode ser removida.
- Se o componente
corefor de propriedade dovendor, ele poderá ser marcado comovendor_availableouvendor. - Uma alteração que torna o objeto principal parte do
vndkpode ser enviada para o Google.
Além disso, se um componente core tiver dependências de um componente do vendor , o componente do vendor deve ser transformado em um componente core ou a dependência deve ser removida de outra forma (por exemplo, removendo a dependência ou movendo a dependência para um componente do vendor ).
Gerenciando cabeçalhos
As dependências de cabeçalho global devem ser removidas para permitir que o sistema de compilação saiba se deve compilar os cabeçalhos com ou sem -D__ANDROID_VNDK__ . Por exemplo, cabeçalhos libutils como utils/StrongPointer.h ainda podem ser acessados usando a biblioteca de cabeçalhos libutils_headers .
Alguns cabeçalhos (como unistd.h ) não podem mais ser incluídos de forma transitiva, mas podem ser incluídos localmente.
Finalmente, a parte pública de private/android_filesystem_config.h foi movida para cutils/android_filesystem_config.h . Para gerenciar esses cabeçalhos, siga um destes procedimentos:
- Remova a dependência de
private/android_filesystem_config.hsubstituindo todas as macrosAID_*por chamadasgetgrnam/getpwnamse possível. Por exemplo:-
(uid_t)AID_WIFItorna-segetpwnam("wifi")->pw_uid. -
(gid_t)AID_SDCARD_Rtorna-se getgrnamgetgrnam("sdcard_r")->gr_gid.
private/android_filesystem_config.h. -
- Para AIS codificado, inclua
cutils/android_filesystem_config.h.