Habilitar VNDK

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.

Compila bibliotecas de sistemas

Figura 1: Compila bibliotecas de sistemas.

  • La imagen del sistema usa las bibliotecas core en esta imagen. Estos vendor, vendor_available no pueden usar bibliotecas vndk o vndk-sp.
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • Las bibliotecas vendor-only (o proprietary) 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 de core).
    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:

  1. Determinar la elegibilidad calculando los tamaños requeridos de Particiones vendor.img y system.img.
  2. Habilitar BOARD_VNDK_VERSION=current. Puedes agregar a BoardConfig.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 de vendor, puede marcarse como vendor_available o vendor.
  • 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 de AID_* con getgrnam/ getpwnam llama si es posible. Por ejemplo:
    • (uid_t)AID_WIFI se convierte en getpwnam("wifi")->pw_uid
    • (gid_t)AID_SDCARD_R se convierte en getgrnam("sdcard_r")->gr_gid
    Para obtener más información, consulta private/android_filesystem_config.h
  • Para AIS codificado de forma rígida, incluye cutils/android_filesystem_config.h