Alat definisi VNDK membantu vendor memigrasikan hierarki sumber mereka ke Lingkungan Android 8.0. Alat ini memindai file biner dalam sistem dan vendor image dasar akan mengatasi dependensi. Berdasarkan grafik dependensi modul, juga dapat mendeteksi pelanggaran terhadap konsep VNDK dan memberikan insight/saran untuk memindahkan modul antarpartisi. Jika Generic System Image (GSI) sudah ditentukan, alat definisi VNDK dapat membandingkan sistem Anda image aplikasi dengan GSI dan menentukan library yang diperluas.
Bagian ini membahas tiga perintah yang sering digunakan untuk definisi VNDK alat:
vndk
. Komputasi VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES, dan EXTRA_VENDOR_LIBRARIES untuk solusi sistem build di Android 8.0 dan lebih tinggi.check-dep
. Periksa dependensi modul yang melanggar dari modul vendor ke pustaka bersama kerangka kerja yang tidak memenuhi syarat.deps
. Cetak dependensi antara pustaka bersama dan file yang dapat dieksekusi.
Untuk detail selengkapnya tentang penggunaan perintah lanjutan, lihat README.md di repositori Alat Definisi VNDK.
{i>vndk<i}
Subperintah vndk
memuat library bersama dan file yang dapat dieksekusi
dari partisi sistem dan partisi vendor, kemudian menyelesaikan modul
dependensi untuk menentukan library
/system/lib[64]/vndk-sp-${VER}
dan /vendor/lib[64]
.
Opsi untuk subperintah vndk
mencakup:
Opsi | Deskripsi |
---|---|
--system |
Arahkan kursor ke direktori yang berisi file yang berada di sistem partisi. |
--vendor |
Arahkan kursor ke direktori yang berisi file yang berada di vendor partisi. |
--aosp-system |
Arahkan kursor ke direktori yang berisi file yang berada di direktori generik image sistem (GSI). |
--load-extra-deps |
Arahkan kursor ke file yang menjelaskan dependensi implisit, seperti
dlopen() . |
Misalnya, untuk mengomputasi kumpulan library VNDK, jalankan perintah
Subperintah vndk
:
./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 tanda titik dua tergantung pada file setelah titik dua. Contoh:
/system/lib/libart.so: /system/lib/libart-compiler.so
Baris ini memberi tahu alat definisi VNDK 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 |
---|---|
{i>vndk_sp<i} | Harus diinstal ke /system/lib[64]/vndk-sp-${VER} |
{i>vndk_sp_ext<i} | Harus diinstal ke /vendor/lib[64]/vndk-sp |
ekstra_vendor_libs | Harus diinstal ke /vendor/lib[64] |
Membangun template sistem
Setelah mengumpulkan {i>output<i} dari alat definisi VNDK, vendor dapat membuat
Android.mk
dan isi VNDK_SP_LIBRARIES
,
VNDK_SP_EXT_LIBRARIES
dan EXTRA_VENDOR_LIBRARIES
ke
mengotomatiskan proses penyalinan library ke penginstalan yang ditentukan
tujuan.
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
dependensi. Jika mendeteksi pelanggaran, Google akan mencetak
penggunaan library dan simbol:
./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 mendeskripsikan kategori framework yang dibagikan library. |
--module-info |
Mengarah ke module-info.json yang dibuat oleh build Android
sistem file. Membantu alat definisi VNDK mengaitkan modul biner dengan modul sumber
pada kode sumber. |
File tag library yang memenuhi syarat
Google menyediakan spreadsheet VNDK yang memenuhi syarat (mis.
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 keduanya modul vendor dan framework. |
LL-NDK-Pribadi | Dependensi pribadi library LL-NDK. Modul vendor tidak boleh mengakses {i>library<i} ini secara langsung. |
VNDK-SP | Dependensi library bersama framework SP-HAL. |
VNDK-SP-Pribadi | Dependensi VNDK-SP yang tidak dapat diakses langsung oleh semua vendor modul. |
VNDK | Library bersama framework yang tersedia untuk modul vendor (kecuali SP-HAL dan SP-HAL-Dep). |
VNDK-Pribadi | Dependensi VNDK yang tidak dapat diakses langsung oleh semua vendor modul. |
KHUSUS FWK | Library bersama khusus framework yang tidak boleh diakses oleh vendor modul (baik secara langsung maupun tidak langsung). |
Khusus FWK | Library bersama khusus framework yang tidak boleh diakses oleh vendor modul (kecuali untuk penggunaan RS). |
Tabel berikut menjelaskan tag yang digunakan untuk library bersama vendor:
Tag | Deskripsi |
---|---|
SP-HAL | Library bersama implementasi HAL dengan proses yang sama. |
SP-HAL-Dep | Dependensi library bersama vendor SP-HAL (juga disebut dependensi SP-HAL kecuali LL-NDK dan VNDK-SP). |
KHUSUS VND | Library bersama yang tidak terlihat di framework yang tidak boleh diakses oleh modul framework. Library VNDK yang diperluas yang disalin diberi tag sebagai KHUSUS VND. |
Hubungan antar-tag:
Gambar 1. Hubungan antar-tag.
dependensi
Untuk men-debug dependensi library, subperintah deps
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 memulai bagian baru. Baris dengan karakter tab bergantung pada bagian. 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
, deps
subperintah mencetak penggunaan library (dibalikkan
dependensi):
./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, {i>output<i} ini menunjukkan bahwa
libdl.so
adalah satu-satunya pengguna ld-android.so
.
Saat menentukan opsi --symbol
, deps
subperintah 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.