O kit de desenvolvimento nativo do fornecedor (VNDK) exige várias mudanças em uma base de código para separar as questões entre o fornecedor e o sistema. Use o guia a seguir para ativar o VNDK em uma base de código de fornecedor/OEM.
Criar bibliotecas do sistema
O sistema de build contém vários tipos de objetos, incluindo bibliotecas (compartilhadas, estáticas ou de cabeçalho) e binários.
Figura 1. Crie bibliotecas do sistema.
- As bibliotecas
coresão usadas pela imagem do sistema. Essas bibliotecas não podem ser usadas pelas bibliotecasvendor,vendor_available,vndkouvndk-sp.cc_library { name: "libThatIsCore", ... }
- As bibliotecas
vendor-only(ouproprietary) são usadas pela imagem do fornecedor.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- As bibliotecas
vendor_availablesão usadas na imagem do fornecedor, que pode conter duplicatas decore.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.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Quando uma biblioteca é marcada como vendor_available:true, ela é criada
duas vezes:
- Uma vez por plataforma (e, portanto, instalado em
/system/lib) - Uma vez para o fornecedor (e, portanto, instalado em
/vendor/libou VNDK APEX)
As versões de fornecedor das bibliotecas são criadas com -D__ANDROID_VNDK__.
Os componentes privados do sistema que podem mudar significativamente em versões futuras do
Android são desativados com essa flag. Além disso, bibliotecas diferentes exportam um conjunto diferente de cabeçalhos, como liblog. As opções específicas de uma variante do fornecedor de uma meta podem ser especificadas em um arquivo Android.bp em:
target: { vendor: { … } }Ativar o VNDK para uma base de código
Para ativar o VNDK em uma base de código:
- Calcule os tamanhos necessários das partições
vendor.imgesystem.imgpara determinar a qualificação. - Ativar
BOARD_VNDK_VERSION=current. Você pode adicionar aoBoardConfig.mkou criar componentes diretamente com ele (por exemplo,m -j BOARD_VNDK_VERSION=current MY-LIB).
Depois de ativar o BOARD_VNDK_VERSION=current, o sistema de build
vai aplicar os seguintes requisitos de dependência e cabeçalho.
Gerenciar dependências
Um objeto vendor que depende de um componente core
que não existe em vndk ou como um objeto vendor
precisa ser resolvido usando uma das seguintes opções:
- A dependência pode ser removida.
- Se o componente
corefor de propriedade devendor, ele poderá ser marcado comovendor_availableouvendor. - Uma mudança que torna o objeto principal parte do
vndkpode ser enviada ao Google.
Além disso, se um componente core tiver dependências de um componente vendor, o componente vendor precisará ser transformado em um componente core ou a dependência precisará ser removida de outra forma (por exemplo, removendo a dependência ou movendo-a para um componente vendor).
Gerenciar cabeçalhos
As dependências de cabeçalho global precisam ser removidas para permitir que o sistema de build saiba
se os cabeçalhos devem ser criados com ou sem -D__ANDROID_VNDK__.
Por exemplo, os cabeçalhos libutils, como utils/StrongPointer.h, ainda podem ser acessados usando a biblioteca de cabeçalho libutils_headers.
Alguns cabeçalhos (como unistd.h) não podem mais ser incluídos de forma transitiva, mas podem ser incluídos localmente.
Por fim, a parte pública de private/android_filesystem_config.h foi movida para cutils/android_filesystem_config.h. Para gerenciar
esses cabeçalhos, faça o seguinte:
- Remova a dependência de
private/android_filesystem_config.hsubstituindo todas as macrosAID_*por chamadasgetgrnam/getpwnam, se possível. Por exemplo:(uid_t)AID_WIFIse tornagetpwnam("wifi")->pw_uid.(gid_t)AID_SDCARD_Rse tornagetgrnam("sdcard_r")->gr_gid.
private/android_filesystem_config.h. - Para AIS codificados, inclua
cutils/android_filesystem_config.h.