Habilita VNDK

El kit de desarrollo nativo del proveedor (VNDK) requiere varios cambios en una base de código para separar las responsabilidades entre el proveedor y el sistema. Usa la siguiente guía para habilitar el VNDK en una base de código de OEM o proveedor.

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.

Compila bibliotecas del sistema

Figura 1: Compila las bibliotecas del sistema.

  • La imagen del sistema usa las bibliotecas de core. vendor, vendor_available, vndk y vndk-sp no pueden usar estas bibliotecas.
    cc_library {
        name: "libThatIsCore",
        ...
    }
  • La imagen del proveedor usa las bibliotecas vendor-only (o proprietary).
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
  • Las bibliotecas de vendor_available se usan en la imagen del proveedor, en la imagen del proveedor (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 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 bibliotecas llndk se usan en 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, se instala en /system/lib)
  • Una vez para el proveedor (y, por lo tanto, instalado en /vendor/lib o en el APEX del VNDK)

Las versiones de proveedor de las bibliotecas se compilan con -D__ANDROID_VNDK__. Con esta marca, se inhabilitan los componentes privados del sistema que pueden cambiar significativamente en versiones futuras de Android. Además, las diferentes bibliotecas exportan un conjunto diferente de encabezados (como liblog). Las opciones específicas de una variante del proveedor de un destino se pueden especificar en un archivo Android.bp en la siguiente ubicación:

target: { vendor: { … } }

Cómo habilitar el VNDK para una base de código

Para habilitar el VNDK en una base de código, haz lo siguiente:

  1. Determina la elegibilidad calculando los tamaños requeridos de las particiones vendor.img y system.img.
  2. Habilitar BOARD_VNDK_VERSION=current. Puedes agregar a BoardConfig.mk o 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 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 debe resolverse con una de las siguientes opciones:

  • Se puede quitar la dependencia.
  • Si el componente core es propiedad de vendor, se puede marcar como vendor_available o vendor.
  • Un cambio que hace que el objeto principal forme parte de vndk se puede enviar de forma ascendente 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 encabezado global para permitir que el sistema de compilación sepa si debe compilar los encabezados con -D__ANDROID_VNDK__ o sin él. Por ejemplo, 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:

  • Quita la dependencia de private/android_filesystem_config.h reemplazando todas las macros AID_* por llamadas a getgrnam/getpwnam 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 la AIS codificada, incluye cutils/android_filesystem_config.h.