Starting March 27, 2025, we recommend using android-latest-release
instead of aosp-main
to build and contribute to AOSP. For more information, see Changes to AOSP.
Enable VNDK
Stay organized with collections
Save and categorize content based on your preferences.
The Vendor Native Development Kit (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.
core
libraries are used by the system image, on the system image. These
libraries can't be used by vendor
, vendor_available
,
vndk
, or vndk-sp
libraries.
cc_library {
name: "libThatIsCore",
...
}
vendor-only
(or proprietary
) libraries are used by the
vendor image, on the vendor image.
cc_library {
name: "libThatIsVendorOnly",
proprietary: true,
# or: vendor: true, # (for things in AOSP)
...
}
vendor_available
libraries are used by the vendor image, on the vendor
image (may contain duplicates of core
).
cc_library {
name: "libThatIsVendorAvailable",
vendor_available: true,
...
}
vndk
libraries are used by the vendor image, on the system image.
cc_library {
name: "libThatIsVndk",
vendor_available: true,
vndk: {
enabled: true,
}
...
}
vndk-sp
libraries are used by the vendor image, and also by the system image
indirectly.
cc_library {
name: "libThatIsVndkSp",
vendor_available: true,
vndk: {
enabled: true,
support_system_process: true,
}
...
}
llndk
libraries are used by both the system and vendor images.
cc_library {
name: "libThatIsLlndk",
llndk: {
symbol_file: "libthatisllndk.map.txt"
}
...
}
When a lib is marked as vendor_available:true
, it's built
twice:
- Once for platform (and thus installed to
/system/lib
)
- Once for vendor (and thus installed to
/vendor/lib
or VNDK APEX)
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: { … } }
Enable VNDK for a codebase
To enable the VNDK for a codebase:
- Determine eligibility by calculating the required sizes of
vendor.img
and system.img
partitions.
- Enable
BOARD_VNDK_VERSION=current
. You can add to
BoardConfig.mk
or build components with it directly (for example,
m -j BOARD_VNDK_VERSION=current MY-LIB
).
After enabling BOARD_VNDK_VERSION=current
, the build system
enforces the following dependency and header requirements.
Manage dependencies
A vendor
object that depends on a core
component
that doesn't exist in vndk
or as a vendor
object
must be resolved using one of the following options:
- The dependency can be removed.
- If the
core
component is owned by vendor
, it can
be marked as vendor_available
or vendor
.
- A change making the core object part of the
vndk
may be
upstreamed to Google.
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).
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 included transitively
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:
- Remove the dependency to
private/android_filesystem_config.h
by replacing all
AID_*
macros with getgrnam
/
getpwnam
calls if possible. For example:
(uid_t)AID_WIFI
becomes
getpwnam("wifi")->pw_uid
.
(gid_t)AID_SDCARD_R
becomes
getgrnam("sdcard_r")->gr_gid
.
For details, refer to
private/android_filesystem_config.h
.
- For hard-coded AIS, include
cutils/android_filesystem_config.h
.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-08-29 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-29 UTC."],[],[],null,["# Enable VNDK\n\nThe Vendor Native Development Kit (VNDK) requires several changes to a codebase to separate\nconcerns between vendor and system. Use the following guide to enable VNDK in a vendor/OEM\ncodebase.\n\nBuild system libraries\n----------------------\n\nThe build system contains several types of objects including libraries\n(shared, static, or header) and binaries.\n\n**Figure 1.** Build system libraries.\n\n- `core` libraries are used by the system image, on the system image. These libraries can't be used by `vendor`, `vendor_available`, `vndk`, or `vndk-sp` libraries. \n\n ```carbon\n cc_library {\n name: \"libThatIsCore\",\n ...\n }\n ```\n- `vendor-only` (or `proprietary`) libraries are used by the vendor image, on the vendor image. \n\n ```carbon\n cc_library {\n name: \"libThatIsVendorOnly\",\n proprietary: true,\n # or: vendor: true, # (for things in AOSP)\n ...\n }\n ```\n- `vendor_available` libraries are used by the vendor image, on the vendor image (may contain duplicates of `core`). \n\n ```carbon\n cc_library {\n name: \"libThatIsVendorAvailable\",\n vendor_available: true,\n ...\n }\n ```\n- `vndk` libraries are used by the vendor image, on the system image. \n\n ```carbon\n cc_library {\n name: \"libThatIsVndk\",\n vendor_available: true,\n vndk: {\n enabled: true,\n }\n ...\n }\n ```\n- `vndk-sp` libraries are used by the vendor image, and also by the system image indirectly. \n\n ```carbon\n cc_library {\n name: \"libThatIsVndkSp\",\n vendor_available: true,\n vndk: {\n enabled: true,\n support_system_process: true,\n }\n ...\n }\n ```\n- `llndk` libraries are used by both the system and vendor images. \n\n ```carbon\n cc_library {\n name: \"libThatIsLlndk\",\n llndk: {\n symbol_file: \"libthatisllndk.map.txt\"\n }\n ...\n }\n ```\n\nWhen a lib is marked as `vendor_available:true`, it's built\ntwice:\n\n- Once for platform (and thus installed to `/system/lib`)\n- Once for vendor (and thus installed to `/vendor/lib` or VNDK APEX)\n\nThe vendor versions of libs are built with `-D__ANDROID_VNDK__`.\nPrivate system components that may change significantly in future versions of\nAndroid are disabled with this flag. In addition, different libraries export a\ndifferent set of headers (such as `liblog`). Options specific to a\nvendor variant of a target can be specified in an `Android.bp` file\nin: \n\n```text\ntarget: { vendor: { … } }\n```\n\nEnable VNDK for a codebase\n--------------------------\n\nTo enable the VNDK for a codebase:\n\n1. Determine eligibility by calculating the required sizes of `vendor.img` and `system.img` partitions.\n2. Enable `BOARD_VNDK_VERSION=current`. You can add to `BoardConfig.mk` or build components with it directly (for example, `m -j BOARD_VNDK_VERSION=current `\u003cvar translate=\"no\"\u003eMY-LIB\u003c/var\u003e).\n\nAfter enabling `BOARD_VNDK_VERSION=current`, the build system\nenforces the following dependency and header requirements.\n\n### Manage dependencies\n\nA `vendor` object that depends on a `core` component\nthat doesn't exist in `vndk` or as a `vendor` object\nmust be resolved using one of the following options:\n\n- The dependency can be removed.\n- If the `core` component is owned by `vendor`, it can be marked as `vendor_available` or `vendor`.\n- A change making the core object part of the `vndk` may be upstreamed to Google.\n\nIn addition, if a `core` component has dependencies on a\n`vendor` component, the `vendor` component must be made\ninto a `core` component **or** the dependency must be\nremoved in another way (for example, by removing the dependency or by moving the\ndependency into a `vendor` component).\n\n### Manage headers\n\nGlobal header dependencies must be removed to enable the build system to know\nwhether to build the headers with or without `-D__ANDROID_VNDK__`.\nFor example, libutils headers such as `utils/StrongPointer.h` can\nstill be accessed using the header library\n[`libutils_headers`](https://android.googlesource.com/platform/system/core/+/android16-release/libutils/include/utils).\n\nSome headers (such as `unistd.h`) can no longer be included transitively\nbut can be included locally.\n\nFinally, the public part of `private/android_filesystem_config.h`\nhas been moved to `cutils/android_filesystem_config.h`. To manage\nthese headers, do one of the following:\n\n- Remove the dependency to `private/android_filesystem_config.h` by replacing all `AID_*` macros with [getgrnam](http://man7.org/linux/man-pages/man3/getgrnam.3.html)/ [getpwnam](http://man7.org/linux/man-pages/man3/getpwnam.3.html) calls if possible. For example:\n - `(uid_t)AID_WIFI` becomes `getpwnam(\"wifi\")-\u003epw_uid`.\n - `(gid_t)AID_SDCARD_R` becomes `getgrnam(\"sdcard_r\")-\u003egr_gid`.\n\n For details, refer to [private/android_filesystem_config.h](https://android.googlesource.com/platform/system/core/+/android16-release/libcutils/include/private/android_filesystem_config.h).\n- For hard-coded AIS, include `cutils/android_filesystem_config.h`."]]