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 archivos binarios.
Figura 1: Bibliotecas del sistema de compilación
- La imagen del sistema usa las bibliotecas
core. Estas bibliotecas no pueden ser usadas por las bibliotecasvendor,vendor_available,vndknivndk-sp.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 sistema usa las bibliotecas
vndk.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- La imagen del proveedor usa las bibliotecas
vndk-sp, y la imagen del sistema también las usa 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 las bibliotecas
llndk.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, se instala en
/system/lib) - Una vez para el proveedor (y, por lo tanto, se instala en
/vendor/libo VNDK APEX)
Las versiones de proveedor de las bibliotecas se compilan con -D__ANDROID_VNDK__.
Los componentes privados del sistema que pueden cambiar de manera significativa en versiones futuras de Android se inhabilitan con esta marca. Además, diferentes bibliotecas exportan un conjunto diferente de encabezados (como liblog). Las opciones específicas para 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 VNDK para una base de código, haz lo siguiente:
- Para determinar la elegibilidad, calcula los tamaños requeridos de las particiones
vendor.imgysystem.img. - Habilita
BOARD_VNDK_VERSION=current. Puedes agregar aBoardConfig.mko compilar 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 o como un objeto vendor debe resolverse con una de las siguientes opciones:
- Se puede quitar la dependencia.
- Si el componente
corees propiedad devendor, se puede marcar comovendor_availableovendor. - Se puede enviar un cambio que haga que el objeto principal forme parte de
vndka 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 encabezado globales para permitir que el sistema de compilación sepa si debe 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 encabezado
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.hreemplazando todas las macrosAID_*por 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 codificados, incluye
cutils/android_filesystem_config.h.