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
core
son utilizadas por la imagen del sistema, en la imagen del sistema. Estas bibliotecas no pueden ser utilizadas por las bibliotecasvendor
,vendor_available
,vndk
ovndk-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_available
bibliotecas 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
vndk
son utilizadas por la imagen del proveedor, en la imagen del sistema.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- Las bibliotecas
vndk-sp
son 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
llndk
son 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/lib
o 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.img
ysystem.img
. - Habilite
BOARD_VNDK_VERSION=current
. Puede agregar aBoardConfig.mk
o 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
core
es propiedad delvendor
, puede marcarse comovendor_available
ovendor
. - Un cambio que hace que el objeto central forme parte del
vndk
puede 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.h
reemplazando todas las macrosAID_*
con llamadasgetgrnam
/getpwnam
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, incluya
cutils/android_filesystem_config.h
.