Alat definisi VNDK membantu vendor memigrasikan hierarki sumber mereka ke lingkungan Android 8.0. Alat ini memindai file biner dalam sistem dan image vendor, lalu me-resolve dependensi. Berdasarkan grafik dependensi modul, alat ini juga dapat mendeteksi pelanggaran terhadap konsep VNDK dan memberikan insight/saran untuk memindahkan modul antar-partisi. Jika Generic System Image (GSI) ditentukan, alat definisi VNDK dapat membandingkan image sistem Anda dengan GSI dan menentukan library yang diperluas.
Bagian ini membahas tiga perintah yang sering digunakan untuk alat definisi VNDK:
vndk
. Menghitung VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES, dan EXTRA_VENDOR_LIBRARIES untuk solusi sistem build di Android 8.0 dan yang lebih tinggi.check-dep
. Periksa dependensi modul yang melanggar dari modul vendor ke library bersama framework yang tidak memenuhi syarat.deps
. Cetak dependensi antara library bersama dan file yang dapat dieksekusi.
Untuk mengetahui detail selengkapnya tentang penggunaan perintah lanjutan, lihat file README.md di repositori VNDK Definition Tool.
vndk
Subperintah vndk
memuat library bersama dan file yang dapat dieksekusi
dari partisi sistem dan partisi vendor, lalu me-resolve dependensi
modul untuk menentukan library yang harus disalin ke
/system/lib[64]/vndk-sp-${VER}
dan /vendor/lib[64]
.
Opsi untuk subperintah vndk
mencakup:
Opsi | Deskripsi |
---|---|
--system |
Arahkan ke direktori yang berisi file yang berada di partisi sistem. |
--vendor |
Arahkan ke direktori yang berisi file yang berada di partisi vendor. |
--aosp-system |
Arahkan ke direktori yang berisi file yang berada di generic system image (GSI). |
--load-extra-deps |
Arahkan ke file yang menjelaskan dependensi implisit, seperti
dlopen() . |
Misalnya, untuk menghitung set library VNDK, jalankan subperintah
vndk
berikut:
./vndk_definition_tool.py vndk \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--aosp-system ${ANDROID_PRODUCT_OUT}/../generic_arm64_ab/system\
--load-extra-deps dlopen.dep
Tentukan dependensi tambahan dengan format file sederhana. Setiap baris mewakili hubungan, dengan file sebelum titik dua bergantung pada file setelah titik dua. Contoh:
/system/lib/libart.so: /system/lib/libart-compiler.so
Baris ini memungkinkan alat definisi VNDK mengetahui bahwa libart.so
bergantung pada libart-compiler.so
.
Tujuan penginstalan
Alat definisi VNDK mencantumkan library dan direktori penginstalan yang sesuai untuk kategori berikut:
Kategori | Direktori |
---|---|
vndk_sp | Harus diinstal ke /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Harus diinstal ke /vendor/lib[64]/vndk-sp |
extra_vendor_libs | Harus diinstal ke /vendor/lib[64] |
Membuat template sistem
Setelah mengumpulkan output dari alat definisi VNDK, vendor dapat membuat
Android.mk
dan mengisi VNDK_SP_LIBRARIES
,
VNDK_SP_EXT_LIBRARIES
, dan EXTRA_VENDOR_LIBRARIES
untuk
mengotomatiskan proses penyalinan library ke tujuan
penginstalan yang ditetapkan.
ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),) VNDK_SP_LIBRARIES := ##_VNDK_SP_## VNDK_SP_EXT_LIBRARIES := ##_VNDK_SP_EXT_## EXTRA_VENDOR_LIBRARIES := ##_EXTRA_VENDOR_LIBS_## #------------------------------------------------------------------------------- # VNDK Modules #------------------------------------------------------------------------------- LOCAL_PATH := $(call my-dir) define define-vndk-lib include $$(CLEAR_VARS) LOCAL_MODULE := $1.$2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_PREBUILT_MODULE_FILE := $$(TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so LOCAL_STRIP_MODULE := false LOCAL_MULTILIB := first LOCAL_MODULE_TAGS := optional LOCAL_INSTALLED_MODULE_STEM := $1.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_RELATIVE_PATH := $3 LOCAL_VENDOR_MODULE := $4 include $$(BUILD_PREBUILT) ifneq ($$(TARGET_2ND_ARCH),) ifneq ($$(TARGET_TRANSLATE_2ND_ARCH),true) include $$(CLEAR_VARS) LOCAL_MODULE := $1.$2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_PREBUILT_MODULE_FILE := $$($$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so LOCAL_STRIP_MODULE := false LOCAL_MULTILIB := 32 LOCAL_MODULE_TAGS := optional LOCAL_INSTALLED_MODULE_STEM := $1.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_RELATIVE_PATH := $3 LOCAL_VENDOR_MODULE := $4 include $$(BUILD_PREBUILT) endif # TARGET_TRANSLATE_2ND_ARCH is not true endif # TARGET_2ND_ARCH is not empty endef $(foreach lib,$(VNDK_SP_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-sp-gen,vndk-sp,))) $(foreach lib,$(VNDK_SP_EXT_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-sp-ext-gen,vndk-sp,true))) $(foreach lib,$(EXTRA_VENDOR_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-ext-gen,,true))) #------------------------------------------------------------------------------- # Phony Package #------------------------------------------------------------------------------- include $(CLEAR_VARS) LOCAL_MODULE := $(YOUR_DEVICE_NAME)-vndk LOCAL_MODULE_TAGS := optional LOCAL_REQUIRED_MODULES := \ $(addsuffix .vndk-sp-gen,$(VNDK_SP_LIBRARIES)) \ $(addsuffix .vndk-sp-ext-gen,$(VNDK_SP_EXT_LIBRARIES)) \ $(addsuffix .vndk-ext-gen,$(EXTRA_VENDOR_LIBRARIES)) include $(BUILD_PHONY_PACKAGE) endif # ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)
check-dep
Subperintah check-dep
memindai modul vendor dan memeriksa
dependensinya. Jika mendeteksi pelanggaran, kode ini akan mencetak penggunaan library dan simbol dependen
yang melanggar:
./vndk_definition_tool.py check-dep \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--tag-file eligible-list.csv \
--module-info ${ANDROID_PRODUCT_OUT}/module-info.json \
1> check_dep.txt \
2> check_dep_err.txt
Misalnya, contoh output berikut menunjukkan dependensi yang melanggar dari
libRS_internal.so
ke libmediandk.so
:
/system/lib/libRS_internal.so MODULE_PATH: frameworks/rs /system/lib/libmediandk.so AImageReader_acquireNextImage AImageReader_delete AImageReader_getWindow AImageReader_new AImageReader_setImageListener
Opsi untuk subperintah check-dep
mencakup:
Opsi | Deskripsi |
---|---|
--tag-file |
Harus merujuk ke file tag library yang memenuhi syarat (dijelaskan di bawah), yang merupakan spreadsheet yang disediakan Google yang menjelaskan kategori library bersama framework. |
--module-info |
Menunjuk ke module-info.json yang dihasilkan oleh sistem build
Android. Hal ini membantu alat definisi VNDK mengaitkan modul biner dengan kode
sumber. |
File tag library yang memenuhi syarat
Google menyediakan spreadsheet VNDK yang memenuhi syarat (misalnya
eligible-list.csv
) yang memberi tag pada library bersama framework yang
dapat digunakan oleh modul vendor:
Tag | Deskripsi |
---|---|
LL-NDK | Library bersama dengan ABI/API stabil yang dapat digunakan oleh modul framework dan vendor. |
LL-NDK-Private | Dependensi pribadi library LL-NDK. Modul vendor tidak boleh mengakses library ini secara langsung. |
VNDK-SP | Dependensi library bersama framework SP-HAL. |
VNDK-SP-Private | Dependensi VNDK-SP yang tidak dapat diakses secara langsung oleh semua modul vendor. |
VNDK | Library bersama framework yang tersedia untuk modul vendor (kecuali SP-HAL dan SP-HAL-Dep). |
VNDK-Pribadi | Dependensi VNDK yang tidak dapat diakses secara langsung oleh semua modul vendor. |
FWK-ONLY | Library bersama khusus framework yang tidak boleh diakses oleh modul vendor (baik secara langsung maupun tidak langsung). |
FWK-ONLY-RS | Library bersama khusus framework yang tidak boleh diakses oleh modul vendor (kecuali untuk penggunaan RS). |
Tabel berikut menjelaskan tag yang digunakan untuk library bersama vendor:
Tag | Deskripsi |
---|---|
SP-HAL | Library bersama implementasi HAL proses yang sama. |
SP-HAL-Dep | Dependensi library bersama vendor SP-HAL (juga disebut dependensi SP-HAL yang mengecualikan LL-NDK dan VNDK-SP). |
KHUSUS VND | Library bersama yang tidak terlihat framework yang tidak boleh diakses oleh modul framework. Library VNDK yang diperluas yang disalin juga diberi tag sebagai VND-ONLY. |
Hubungan antar-tag:

Gambar 1. Hubungan antar-tag.
dependensi
Untuk men-debug dependensi library, subperintah deps
akan mencetak
dependensi modul:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Output terdiri dari beberapa baris. Baris tanpa karakter tab akan memulai bagian baru. Baris dengan karakter tab bergantung pada bagian sebelumnya. Contoh:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
Output ini menunjukkan bahwa ld-android.so
tidak memiliki dependensi
dan libc.so
bergantung pada libdl.so
.
Saat menentukan opsi --revert
, subperintah
deps
akan mencetak penggunaan library (dependensi
terbalik):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Contoh:
/system/lib/ld-android.so /system/lib/libdl.so
Output ini menunjukkan bahwa ld-android.so
digunakan oleh
libdl.so
, atau dengan kata lain, libdl.so
bergantung pada
ld-android.so
. Selain itu, output ini menunjukkan bahwa
libdl.so
adalah satu-satunya pengguna ld-android.so
.
Saat menentukan opsi --symbol
, subperintah
deps
akan mencetak simbol yang digunakan:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Contoh:
/system/lib/libc.so /system/lib/libdl.so android_get_application_target_sdk_version dl_unwind_find_exidx dlclose dlerror dlopen dlsym
Output ini menunjukkan bahwa libc.so
bergantung pada enam fungsi yang diekspor
dari libdl.so
. Jika opsi --symbol
dan
opsi --revert
ditentukan, simbol yang digunakan oleh pengguna
akan dicetak.