El VNDK requiere varios cambios en una base de código para separar las preocupaciones entre el proveedor y el sistema. Utilice la siguiente guía para habilitar VNDK en un código base de proveedor/OEM.
Construir bibliotecas del sistema
El sistema de compilación contiene varios tipos de objetos, incluidas bibliotecas (compartidas, estáticas o de encabezado) y archivos binarios.

- Las bibliotecas
coreson utilizadas por la imagen del sistema, en la imagen del sistema. Estas bibliotecas no pueden ser utilizadas por las bibliotecasvendor,vendor_available,vndkovndk-sp.cc_library { name: "libThatIsCore", ... } - Las bibliotecas exclusivas
vendor-only(oproprietary) son utilizadas por la imagen del proveedor, en la imagen del proveedor.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... } -
vendor_availablebibliotecas de proveedor_disponibles son utilizadas por la imagen del proveedor, en la imagen del proveedor (pueden contener duplicados decore).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... } - Las bibliotecas
vndkson utilizadas por la imagen del proveedor, en la imagen del sistema.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... } - Las bibliotecas
vndk-spson utilizadas por la imagen del proveedor y también por la imagen del sistema indirectamente.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... } - Las bibliotecas
llndkson utilizadas tanto por el sistema como por las imágenes del proveedor.llndk_library { name: "libThatIsLlndk", }
Cuando una librería está marcada como vendor_available:true , se compila dos veces:
- Una vez por plataforma (y por lo tanto instalada en
/system/lib) - Una vez para el proveedor (y, por lo tanto, instalado en
/vendor/libo VNDK APEX)
Las versiones de proveedor de libs se compilan con -D__ANDROID_VNDK__ . Los componentes privados del sistema que pueden cambiar significativamente en futuras versiones de Android están deshabilitados con esta bandera. Además, diferentes bibliotecas exportan un conjunto diferente de encabezados (como liblog ). Las opciones específicas de una variante de proveedor de un objetivo se pueden especificar en un archivo Android.bp en:
target: { vendor: { … } }Habilitación de VNDK para una base de código
Para habilitar el VNDK para una base de código:
- Determine la elegibilidad calculando los tamaños requeridos de las particiones
vendor.imgysystem.img. - Habilite
BOARD_VNDK_VERSION=current. Puede agregar aBoardConfig.mko crear componentes con él directamente (por ejemplo,m -j BOARD_VNDK_VERSION=current MY-LIB).
Después de habilitar BOARD_VNDK_VERSION=current , el sistema de compilación aplica los siguientes requisitos de dependencia y encabezado.
Administrar dependencias
Un objeto de vendor que depende de un componente core que no existe en vndk o como objeto de vendor debe resolverse mediante una de las siguientes opciones:
- La dependencia se puede eliminar.
- Si el componente
corees propiedad delvendor, puede marcarse comovendor_availableovendor. - Un cambio que hace que el objeto central forme parte del
vndkpuede transmitirse a Google.
Además, si un componente core tiene dependencias en un componente de vendor , el componente de vendor debe convertirse en un componente core o la dependencia debe eliminarse de otra manera (por ejemplo, eliminando la dependencia o moviendo la dependencia a un componente de vendor ). ).
Gestión de encabezados
Las dependencias de encabezados globales deben eliminarse para permitir que el sistema de compilación sepa si debe compilar los encabezados con o sin -D__ANDROID_VNDK__ . Por ejemplo, todavía se puede acceder a los encabezados de libutils como utils/StrongPointer.h mediante la biblioteca de encabezados libutils_headers .
Algunos encabezados (como unistd.h ) ya no se pueden incluir de forma transitiva, pero se pueden incluir localmente.
Finalmente, la parte pública de private/android_filesystem_config.h se ha movido a cutils/android_filesystem_config.h . Para administrar estos encabezados, realice una de las siguientes acciones:
- Elimine la dependencia de
private/android_filesystem_config.hreemplazando todas las macrosAID_*con llamadasgetgrnam/getpwnamsi es posible. Por ejemplo:-
(uid_t)AID_WIFIse convierte engetpwnam("wifi")->pw_uid. -
(gid_t)AID_SDCARD_Rse convierte engetgrnam("sdcard_r")->gr_gid.
private/android_filesystem_config.h. -
- Para AIS codificado de forma rígida, incluya
cutils/android_filesystem_config.h.