VNDK tanım aracı, tedarikçilerin kaynak ağaçlarını Android 8.0 ortamına taşımalarına yardımcı olur. Bu araç, sistemdeki ve tedarikçi firma resimlerindeki ikili dosyaları tarar, ardından bağımlılıkları çözer. Modül bağımlılık grafiğine dayalı olarak araç, VNDK kavramlarının ihlallerini de algılayabilir ve modülleri bölümler arasında taşımayla ilgili analizler/öneriler sağlayabilir. Genel sistem görüntüsü (GSI) belirtilirse VNDK tanım aracı, sistem görüntünüzü GSI ile karşılaştırabilir ve genişletilmiş kitaplıkları belirleyebilir.
Bu bölümde, VNDK tanım aracı için sık kullanılan üç komut ele alınmaktadır:
vndk
. Android 8.0 ve sonraki sürümlerde derleme sistemi geçici çözümü için VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES ve EXTRA_VENDOR_LIBRARIES değerlerini hesaplayın.check-dep
. Tedarikçi modüllerinden uygun olmayan çerçeve paylaşılan kitaplıklarına kadar ihlal eden modül bağımlılıkları kontrol edin.deps
. Paylaşılan kitaplıklar ile yürütülebilir dosyalar arasındaki bağımlılıkları yazdırın.
Gelişmiş komut kullanımı hakkında daha fazla bilgi için VNDK Tanım Aracı deposundaki README.md dosyasını inceleyin.
vndk
vndk
alt komutu, sistem bölümünden ve tedarikçi bölümlerinden paylaşılan kitaplıkları ve yürütülebilir dosyaları yükler, ardından /system/lib[64]/vndk-sp-${VER}
ve /vendor/lib[64]
'ye kopyalanmaları gereken kitaplıkları belirlemek için modül bağımlılıkları çözer.
vndk
alt komutu için seçenekler şunlardır:
Option | Açıklama |
---|---|
--system |
Sistem bölümündeki dosyaları içeren bir dizini işaret edin. |
--vendor |
Tedarikçi firma bölümünde bulunan dosyaları içeren bir dizine işaret edin. |
--aosp-system |
Genel sistem resminde (GSI) bulunan dosyaları içeren bir dizini işaret edin. |
--load-extra-deps |
dlopen() gibi, gizli bağımlılıkları açıklayan bir dosyayı işaret edin. |
Örneğin, VNDK kitaplık kümelerini hesaplamak için aşağıdaki vndk
alt komutunu çalıştırın:
./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
Basit bir dosya biçimiyle ek bağımlılıkları belirtin. Her satır bir ilişkiyi temsil eder. İki nokta işaretinden önceki dosya, iki nokta işaretinden sonraki dosyaya bağlıdır. Örnek:
/system/lib/libart.so: /system/lib/libart-compiler.so
Bu satır, VNDK tanım aracının libart.so
'ün libart-compiler.so
'e bağlı olduğunu bilmesini sağlar.
Yükleme hedefi
VNDK tanım aracı, aşağıdaki kategoriler için kitaplıkları ve ilgili yükleme dizinlerini listeler:
Kategori | Dizin |
---|---|
vndk_sp | /system/lib[64]/vndk-sp-${VER} 'e yüklenmelidir |
vndk_sp_ext | /vendor/lib[64]/vndk-sp 'e yüklenmelidir |
extra_vendor_libs | /vendor/lib[64] 'e yüklenmelidir |
Sistem şablonları oluşturma
Tedarikçi firma, VNDK tanım aracından çıkışları topladıktan sonra kitaplıkları belirlenen yükleme hedefine kopyalama işlemini otomatikleştirmek için bir Android.mk
oluşturup VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
ve EXTRA_VENDOR_LIBRARIES
değerlerini doldurabilir.
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
check-dep
alt komutu, tedarikçi firma modüllerini tarar ve bağımlılıklarını kontrol eder. İhlaller tespit ederse ihlal eden bağımlı kitaplık ve simge kullanımlarını yazdırır:
./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
Örneğin, aşağıdaki örnek çıkışta libRS_internal.so
ile libmediandk.so
arasındaki ihlal eden bir bağımlılık gösterilmektedir:
/system/lib/libRS_internal.so MODULE_PATH: frameworks/rs /system/lib/libmediandk.so AImageReader_acquireNextImage AImageReader_delete AImageReader_getWindow AImageReader_new AImageReader_setImageListener
check-dep
alt komutu için seçenekler şunlardır:
Option | Açıklama |
---|---|
--tag-file |
Uygun bir kitaplık etiketi dosyasına (aşağıda açıklanmıştır) atıfta bulunmalıdır. Bu dosya, Google tarafından sağlanan ve paylaşılan çerçeve kitaplıklarının kategorilerini açıklayan bir e-tablodur. |
--module-info |
Android derleme sistemi tarafından oluşturulan module-info.json dosyasını gösterir. VNDK tanım aracının ikili modülleri kaynak kodla ilişkilendirmesine yardımcı olur. |
Uygun kitaplık etiketi dosyası
Google, tedarikçi modülleri tarafından kullanılabilen çerçeve paylaşılan kitaplıklarını etiketleyen uygun bir VNDK e-tablosu (ör. eligible-list.csv
) sağlar:
Etiketle | Açıklama |
---|---|
LL-NDK | Hem çerçeve hem de tedarikçi modülleri tarafından kullanılabilen kararlı ABI'ler/API'ler içeren paylaşılan kitaplıklar. |
LL-NDK-Private | LL-NDK kitaplıklarının özel bağımlılıkları. Tedarikçi modülleri bu kitaplıklara doğrudan erişmemelidir. |
VNDK-SP | SP-HAL çerçevesi paylaşılan kitaplık bağımlılıkları. |
VNDK-SP-Private | Tüm tedarikçi modülleri tarafından doğrudan erişilemeyen VNDK-SP bağımlılıkları. |
VNDK | Tedarikçi modülleri tarafından kullanılabilen çerçeve paylaşılan kitaplıkları (SP-HAL ve SP-HAL-Dep hariç). |
VNDK-Private | Tüm tedarikçi modülleri tarafından doğrudan erişilemeyen VNDK bağımlılıkları. |
FWK-ONLY | Tedarikçi modülleri tarafından erişilmemesi gereken (doğrudan veya dolaylı olarak) yalnızca çerçeve paylaşılan kitaplıkları. |
FWK-ONLY-RS | Tedarikçi modülleri tarafından erişilmemesi gereken, yalnızca çerçeveyle paylaşılan kitaplıklar (RS kullanımları hariç). |
Aşağıdaki tabloda, tedarikçi firmanın paylaştığı kitaplıklar için kullanılan etiketler açıklanmaktadır:
Etiketle | Açıklama |
---|---|
SP-HAL | Aynı işlem HAL uygulamalı paylaşılan kitaplıklar. |
SP-HAL-Dep | SP-HAL tedarikçi firma paylaşılan kitaplık bağımlılıkları (LL-NDK ve VNDK-SP hariç SP-HAL bağımlılıkları olarak da bilinir). |
VND-ONLY | Çerçeve modülleri tarafından erişilmemesi gereken, çerçeveye görünmeyen paylaşılan kitaplıklar. Kopyalanan genişletilmiş VNDK kitaplıkları da YALNIZCA-VND olarak etiketlenir. |
Etiketler arasındaki ilişkiler:

Şekil 1. Etiketler arasındaki ilişkiler.
deps
Kitaplık bağımlılıklarında hata ayıklama yapmak için deps
alt komutu, modül bağımlılıklarını yazdırır:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Çıkış birden fazla satırdan oluşur. Sekme karakteri içermeyen satır yeni bir bölüm başlatır. Sekme karakteri içeren satır, önceki bölüme bağlıdır. Örnek:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
Bu çıkış, ld-android.so
'ün bağımlılığının olmadığını ve libc.so
'un libdl.so
'ye bağlı olduğunu gösterir.
--revert
seçeneği belirtildiğinde deps
alt komutu, kitaplıkların kullanımlarını (ters bağımlılıklar) yazdırır:
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Örnek:
/system/lib/ld-android.so /system/lib/libdl.so
Bu çıkış, ld-android.so
'ün libdl.so
tarafından kullanıldığını veya başka bir deyişle libdl.so
'ün ld-android.so
'e bağlı olduğunu gösterir. Ayrıca bu çıkışta, libdl.so
'in ld-android.so
'un tek kullanıcısı olduğu da gösterilir.
--symbol
seçeneği belirtildiğinde deps
alt komutu, kullanılan sembolleri yazdırır:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Örnek:
/system/lib/libc.so /system/lib/libdl.so android_get_application_target_sdk_version dl_unwind_find_exidx dlclose dlerror dlopen dlsym
Bu çıkış, libc.so
'ün libdl.so
'ten dışa aktarılan altı işleve bağlı olduğunu gösterir. Hem --symbol
hem de --revert
seçeneği belirtilirse kullanıcı tarafından kullanılan semboller yazdırılır.