El kit de desarrollo nativo del proveedor (VNDK) requiere varios cambios en la base de código para separarlos inquietudes entre el proveedor y el sistema. Usa la siguiente guía para habilitar VNDK en un proveedor o OEM base de código.
Compila bibliotecas de sistemas
El sistema de compilación contiene varios tipos de objetos, incluidas bibliotecas (compartida, estática o con encabezado) y objetos binarios.
Figura 1: Compila bibliotecas de sistemas.
- La imagen del sistema usa las bibliotecas
core
en esta imagen. Estosvendor
,vendor_available
no pueden usar bibliotecasvndk
ovndk-sp
.cc_library { name: "libThatIsCore", ... }
- Las bibliotecas
vendor-only
(oproprietary
) se usan en del proveedor o de un proveedor.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- La imagen del proveedor usa las bibliotecas
vendor_available
en el proveedor imagen (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
de forma indirecta.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- Las imágenes del sistema y del proveedor usan bibliotecas
llndk
.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Cuando se marca una biblioteca como vendor_available:true
, se compila
dos veces:
- Una vez para la plataforma (y, por lo tanto, se instala en
/system/lib
) - Una vez para el proveedor (y, por lo tanto, se instala en
/vendor/lib
o VNDK APEX)
Las versiones de proveedores de las bibliotecas se compilan con -D__ANDROID_VNDK__
.
componentes del sistema privado que pueden cambiar significativamente en versiones futuras de
Android se inhabilitan con esta marca. Además, diferentes bibliotecas exportan
un conjunto diferente de encabezados (como liblog
). Opciones específicas
la variante de proveedor de un destino se puede especificar en un archivo Android.bp
en:
target: { vendor: { … } }
Cómo habilitar VNDK para una base de código
Si quieres habilitar el VNDK para una base de código, haz lo siguiente:
- Determinar la elegibilidad calculando los tamaños requeridos de
Particiones
vendor.img
ysystem.img
. - Habilitar
BOARD_VNDK_VERSION=current
. Puedes agregar aBoardConfig.mk
o compila componentes directamente con él (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.
Cómo administrar dependencias
Un objeto vendor
que depende de un componente core
que no existe en vndk
ni como un objeto vendor
se deben resolver mediante una de las siguientes opciones:
- Se puede quitar la dependencia.
- Si el componente
core
es propiedad devendor
, puede marcarse comovendor_available
ovendor
. - Es posible que un cambio que haga que el objeto principal forme parte de
vndk
se ascendieron a Google.
Además, si un componente core
depende de un
vendor
, el componente vendor
debe crearse
en un componente core
o la dependencia debe
puede quitarse de otra manera (por ejemplo, quitando la dependencia o moviendo
dependencia en un componente vendor
).
Administrar encabezados
Se deben quitar las dependencias del encabezado global para que el sistema de compilación pueda
si quieres compilar los encabezados con o sin -D__ANDROID_VNDK__
.
Por ejemplo, los encabezados de libutils, como utils/StrongPointer.h
, pueden
aún se accederá 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 movió a cutils/android_filesystem_config.h
. Para administrar
estos encabezados, realiza una de las siguientes acciones:
- Quita la dependencia de
private/android_filesystem_config.h
reemplazando todo Macros deAID_*
congetgrnam
/getpwnam
llama si es posible. 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 codificado de forma rígida, incluye
cutils/android_filesystem_config.h