El kit de desarrollo nativo del proveedor (VNDK) requiere varios cambios en una base de código para separar las inquietudes entre el proveedor y el sistema. Usa la siguiente guía para habilitar VNDK en una base de código de proveedor o OEM.
Compila bibliotecas del sistema
El sistema de compilación contiene varios tipos de objetos, incluidas bibliotecas (compartidas, estáticas o de encabezado) y objetos binarios.

Figura 1: Compila las bibliotecas del sistema.
- La imagen del sistema usa las bibliotecas
core
. Las bibliotecasvendor
,vendor_available
,vndk
ovndk-sp
no pueden usar estas bibliotecas.cc_library { name: "libThatIsCore", ... }
- La imagen del proveedor usa las bibliotecas
vendor-only
(oproprietary
).cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- La imagen del proveedor usa las bibliotecas
vendor_available
(puede contener duplicados decore
).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
- La imagen del proveedor usa las bibliotecas
vndk
en la imagen del sistema.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- La imagen del proveedor y la imagen del sistema usan las bibliotecas
vndk-sp
indirectamente.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- Las bibliotecas
llndk
las usan las imágenes del sistema y del proveedor.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Cuando una biblioteca se marca como vendor_available:true
, se compila dos veces:
- Una vez para la plataforma (y, por lo tanto, instalada en
/system/lib
) - Una vez para el proveedor (y, por lo tanto, instalado en
/vendor/lib
o VNDK APEX)
Las versiones de proveedores de las bibliotecas se compilan con -D__ANDROID_VNDK__
.
Con esta marca, se inhabilitan los componentes privados del sistema que pueden cambiar de forma significativa en versiones futuras de Android. Además, diferentes bibliotecas exportan un conjunto diferente de encabezados (como liblog
). Las opciones específicas de una variante de proveedor de un destino se pueden especificar en un archivo Android.bp
en:
target: { vendor: { … } }
Habilita VNDK para una base de código
Para habilitar el VNDK para una base de código, haz lo siguiente:
- Para determinar la elegibilidad, calcula los tamaños requeridos de las particiones
vendor.img
ysystem.img
. - Habilitar
BOARD_VNDK_VERSION=current
. Puedes agregar aBoardConfig.mk
o compilar 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 encabezado y dependencia.
Cómo administrar dependencias
Un objeto vendor
que depende de un componente core
que no existe en vndk
o como un objeto vendor
se debe resolver con una de las siguientes opciones:
- Se puede quitar la dependencia.
- Si
vendor
es propietario del componentecore
, se puede marcar comovendor_available
ovendor
. - Es posible que un cambio que haga que el objeto principal forme parte de
vndk
se transmita a Google.
Además, si un componente core
tiene dependencias de un componente vendor
, el componente vendor
debe convertirse en un componente core
o la dependencia debe quitarse de otra manera (por ejemplo, quitando la dependencia o moviéndola a un componente vendor
).
Administra encabezados
Se deben quitar las dependencias de encabezados globales para que el sistema de compilación sepa si compilar los encabezados con o sin -D__ANDROID_VNDK__
.
Por ejemplo, aún se puede acceder a los encabezados de libutils, como utils/StrongPointer.h
, con la biblioteca de encabezados libutils_headers
.
Algunos encabezados (como unistd.h
) ya no se pueden incluir de forma transitiva, pero se pueden incluir de forma local.
Por último, la parte pública de private/android_filesystem_config.h
se trasladó a cutils/android_filesystem_config.h
. Para administrar estos encabezados, realiza una de las siguientes acciones:
- Si es posible, quita la dependencia de
private/android_filesystem_config.h
reemplazando todas las macrosAID_*
por llamadas agetgrnam
/getpwnam
. Por ejemplo:(uid_t)AID_WIFI
se convierte engetpwnam("wifi")->pw_uid
.(gid_t)AID_SDCARD_R
se convierte engetgrnam("sdcard_r")->gr_gid
.
private/android_filesystem_config.h
. - Para AIS hard-coded, incluye
cutils/android_filesystem_config.h
.