The VNDK requires several changes to a codebase to separate concerns between vendor and system. Use the following guide to enable VNDK in a vendor/OEM codebase.

Build system libraries

The build system contains several types of objects including libraries (shared, static, or header) and binaries:

Figure 1. Build system libraries.

When a lib is marked as vendor_available:true, it is built twice:

The vendor versions of libs are built with -D__ANDROID_VNDK__. Private system components that may change significantly in future versions of Android are disabled with this flag. In addition, different libraries export a different set of headers (such as liblog). Options specific to a vendor variant of a target can be specified in an Android.bp file in:

target: { vendor: { … } }

Enabling VNDK for a codebase

To enable the VNDK for a codebase:

  1. Determine eligibility by calculating the required sizes of vendor.img and system.img partitions.
  2. Enable BOARD_VNDK_VERSION=current. You can add to BoardConfig.mk or build components with it directly (i.e. m -j BOARD_VNDK_VERSION=current MY-LIB).

After enabling BOARD_VNDK_VERSION=current, the build system enforces the following dependency and header requirements.

Managing dependencies

A vendor object that depends on a core component that doesn't exist in the vndk or as a vendor object must be resolved using one of the following options:

In addition, if a core component has dependencies on a vendor component, the vendor component must be made into a core component or the dependency must be removed in another way (for example, by removing the dependency or by moving the dependency into a vendor component).

Managing headers

Global header dependencies must be removed to enable the build system to know whether to build the headers with or without -D__ANDROID_VNDK__. For example, libutils headers such as utils/StrongPointer.h can still be accessed using the header library libutils_headers.

Some headers (such as unistd.h) can no longer be transitively included but can be included locally.

Finally, the public part of private/android_filesystem_config.h has been moved to cutils/android_filesystem_config.h. To manage these headers, do one of the following: