Habilitación del VNDK

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.

Construir bibliotecas del sistema
Figura 1. Bibliotecas del sistema de compilación
  • Las bibliotecas core son utilizadas por la imagen del sistema, en la imagen del sistema. Estas bibliotecas no pueden ser utilizadas por las bibliotecas vendor , vendor_available , vndk o vndk-sp .
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • Las bibliotecas exclusivas vendor-only (o proprietary ) 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 de core ).
    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:

  1. Determine la elegibilidad calculando los tamaños requeridos de las particiones vendor.img y system.img .
  2. Habilite BOARD_VNDK_VERSION=current . Puede agregar a BoardConfig.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 del vendor , puede marcarse como vendor_available o vendor .
  • 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 macros AID_* con llamadas 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, consulte private/android_filesystem_config.h .
  • Para AIS codificado de forma rígida, incluya cutils/android_filesystem_config.h .