4.0 KiB
VNDK Definition Tool
VNDK definition tool was designed to classify all shared libraries in the system partition and give suggestions to copy necessary libraries to the vendor partition.
Usage
To run VNDK definition tool, you will need three inputs:
- The system and vendor image for your target
- Android Treble reference image
- Eligible VNDK list from Google (e.g. eligible-list-v3.0.csv)
The high-level overview of the command line usage is:
$ python3 ./vndk_definition_tool.py vndk \
--system "/path/to/your/product_out/system" \
--vendor "/path/to/your/product_out/vendor" \
--aosp-system "/path/to/aosp/generic/system" \
--tag-file "eligible-list-v3.0.csv"
This command will print several lines such as:
vndk-sp: libexample1.so
vndk-sp-ext: libexample2.so
extra-vendor-libs: libexample3.so
The output implies:
libexample1.so
should be copied to/system/lib[64]/vndk-sp
.libexample2.so
should be copied to/vendor/lib[64]/vndk-sp
.libexample3.so
should be copied to/vendor/lib[64]
.
Makefile Boilerplates
There are some boilerplates in templates
directory that can automate the
process to copy shared libraries. Please copy a boilerplate, rename it as
Android.mk
, and replace the placeholders with corresponding values:
-
##_VNDK_SP_##
should be replaced by library names tagged withvndk_sp
. -
##_VNDK_SP_EXT_##
should be replaced by library names tagged withvndk_sp_ext
. -
##_EXTRA_VENDOR_LIBS_##
should be replaced by library names tagged withextra_vendor_libs
. -
$(YOUR_DEVICE_NAME)
has to be replaced by your own device product name.
VNDK definition tool can fill in the library names and generate an Android.mk
when the --output-format=make
is specified:
$ python3 ./vndk_definition_tool.py vndk \
--system "/path/to/your/product_out/system" \
--vendor "/path/to/your/product_out/vendor" \
--aosp-system "/path/to/aosp/generic/system" \
--tag-file "eligible-list-v3.0.csv" \
--output-format=make
These boilerplates only define the modules to copy shared libraries.
Developers have to add the phony package name to PRODUCT_PACKAGES
variable in
the device.mk
for their devices.
PRODUCT_PACKAGES += $(YOUR_DEVICE_NAME)-vndk
Ignore Subdirectories
Some devices keep their vendor modules in /system/vendor
. To run VNDK
definition tool for those devices, we have to skip /system/vendor
and specify
it with --vendor
option. For example:
python3 vndk_definition_tool.py vndk \
--system ${ANDROID_PRODUCT_OUT}/system \
--system-dir-ignored vendor \
--vendor ${ANDROID_PRODUCT_OUT}/system/vendor \
# ...
Implicit Dependencies
If there are implicit dependencies, such as dlopen()
, we can specify them in
a dependency file and load the dependency file with --load-extra-deps
. The
dependency file format is simple: (a) each line stands for a dependency, and
(b) the file before the colon depends on the file after the colon. For
example, libart.so
depends on libart-compiler.so
:
/system/lib64/libart.so: /system/lib64/libart-compiler.so
And then, run VNDK definition tool with:
$ python3 vndk_definition_tool.py vndk \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--aosp-system ${ANDROID_PRODUCT_OUT}/../generic_arm64_a \
--tag-file eligible-list-v3.0.csv \
--load-extra-deps dlopen.dep
Remarks
To run VNDK definition tool against an image (.img
), run the following
command to mount the images and run vndk_definition_tool.py
with sudo
:
$ simg2img system.img system.raw.img
$ simg2img vendor.img vendor.raw.img
$ mkdir system
$ mkdir vendor
$ sudo mount -o loop,ro system.raw.img system
$ sudo mount -o loop,ro vendor.raw.img vendor
$ sudo python3 vndk_definition_tool.py vndk \
--system system \
--vendor vendor \
--aosp-system /path/to/aosp/generic/system \
--tag-file eligible-list-v3.0.csv