VNDK tanım aracı, satıcıların kaynak ağaçlarını Android 8.0 ortamına taşımasına yardımcı olur. Bu araç, sistemdeki ikili dosyaları ve tedarikçi resimlerini tarar, ardından bağımlılıkları giderir. Modül bağımlılığı grafiğine göre araç, VNDK kavramlarıyla ilgili ihlalleri de tespit edebilir ve modülleri bölümler arasında taşımak için analiz/öneri sağlayabilir. Genel Sistem Görüntüsü (GSI) belirtilmişse 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ında 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'ı hesaplayın.check-dep
. Satıcı modüllerinden uygun olmayan çerçeve paylaşılan kitaplıklarına kadar, ihlalde bulunan modül bağımlılıklarını kontrol edin.deps
. Paylaşılan kitaplıklar ve 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 Definition Tool deposundaki README.md dosyasına bakın.
vndk
vndk
alt komutu, paylaşılan kitaplıkları ve yürütülebilir dosyaları sistem bölümünden ve satıcı bölümlerinden yükler, ardından modül bağımlılıklarını çözerek /system/lib[64]/vndk-sp-${VER}
ve /vendor/lib[64]
'ye kopyalanması gereken kitaplıkları belirler.
vndk
alt komutu için seçenekler şunlardır:
Option | Açıklama |
---|---|
--system |
Sistem bölümünde bulunan dosyaları içeren bir dizini işaret edin. |
--vendor |
Bir satıcı bölümünde bulunan dosyaları içeren bir dizini işaret edin. |
--aosp-system |
Genel sistem görüntüsünde (GSI) bulunan dosyaları içeren bir dizini işaret edin. |
--load-extra-deps |
Örtülü bağımlılıkları açıklayan bir dosyayı (ör. dlopen() ) 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 üst üste işaretinden önceki dosya, iki nokta üst üste işaretinden sonraki dosyaya bağlıdır. Örneğin:
/system/lib/libart.so: /system/lib/libart-compiler.so
Bu satır, VNDK tanım aracına libart.so
öğesinin libart-compiler.so
öğesine bağlı olduğunu bildirir.
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} konumuna yüklenmelidir. |
vndk_sp_ext | /vendor/lib[64]/vndk-sp konumuna yüklenmelidir. |
extra_vendor_libs | /vendor/lib[64] konumuna yüklenmelidir. |
Sistem şablonları oluşturma
VNDK tanım aracından çıktıları topladıktan sonra bir satıcı, Android.mk
oluşturabilir ve kitaplıkları belirlenen yükleme hedefine kopyalama sürecini otomatikleştirmek için VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
ve EXTRA_VENDOR_LIBRARIES
değerlerini girebilir.
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 modüllerini tarar ve bağımlılıklarını kontrol eder. İhlal tespit ederse ihlalde bulunan bağımlı kitaplığı ve sembol 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 çıktıda libRS_internal.so
ile libmediandk.so
arasında ihlalde bulunan 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 |
Google tarafından sağlanan ve paylaşılan çerçeve kitaplıklarının kategorilerini açıklayan bir e-tablo olan uygun bir kitaplık etiketi dosyasına (aşağıda açıklanmıştır) başvurmalıdır. |
--module-info |
Android derleme sistemi tarafından oluşturulan module-info.json 'yı gösterir. VNDK tanım aracının ikili modülleri kaynak koduyla ilişkilendirmesine yardımcı olur. |
Uygun kitaplık etiketi dosyası
Google, satıcı modülleri tarafından kullanılabilecek paylaşılan çerçeve 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 satıcı modülleri tarafından kullanılabilen, kararlı ABI'lere/API'lere sahip 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üllerinin doğrudan erişemediği VNDK-SP bağımlılıkları. |
VNDK | Tedarikçi modüllerinde (SP-HAL ve SP-HAL-Dep hariç) kullanılabilen çerçeve paylaşılan kitaplıkları. |
VNDK-Private | Tüm satıcı modüllerinin doğrudan erişemediği VNDK bağımlılıkları. |
FWK-ONLY | Yalnızca çerçeveye ait olan ve satıcı modülleri tarafından (doğrudan veya dolaylı olarak) erişilmemesi gereken paylaşılan kitaplıklar. |
FWK-ONLY-RS | Tedarikçi modüllerinin (RS kullanımları hariç) erişmemesi gereken, yalnızca çerçeveye ait paylaşılan kitaplıklar. |
Aşağıdaki tabloda, tedarikçi tarafından paylaşılan kitaplıklar için kullanılan etiketler açıklanmaktadır:
Etiketle | Açıklama |
---|---|
SP-HAL | Aynı işlemde HAL uygulaması paylaşılan kitaplıkları. |
SP-HAL-Dep | SP-HAL satıcısı tarafından paylaşılan kitaplık bağımlılıkları (LL-NDK ve VNDK-SP hariç olmak üzere SP-HAL bağımlılıkları olarak da adlandırılır). |
YALNIZCA VND | Çerçeve modülleri tarafından erişilmemesi gereken, çerçeve tarafından görünmeyen paylaşılan kitaplıklar. Kopyalanan genişletilmiş VNDK kitaplıkları da VND-ONLY olarak etiketlenir. |
Etiketler arasındaki ilişkiler:

1. şekil. Etiketler arasındaki ilişkiler.
deps
Kitaplık bağımlılıklarında hata ayıklamak 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üme başlar. Sekme karakteri içeren satır, önceki bölüme bağlıdır. Örneğin:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
Bu çıktı, ld-android.so
öğesinin bağımlılığı olmadığını ve libc.so
öğesinin libdl.so
öğesine bağlı olduğunu gösterir.
--revert
seçeneği belirtildiğinde deps
alt komutu, kitaplıkların kullanımı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
Örneğin:
/system/lib/ld-android.so /system/lib/libdl.so
Bu çıktı, ld-android.so
öğesinin libdl.so
tarafından kullanıldığını veya başka bir deyişle libdl.so
öğesinin ld-android.so
öğesine bağlı olduğunu gösterir. Ayrıca bu çıktı, libdl.so
kullanıcısının ld-android.so
öğesinin tek kullanıcısı olduğunu gösterir.
--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
Örneğin:
/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
öğesinin libdl.so
öğesinden dışa aktarılan altı işleve bağlı olduğunu gösterir. Hem --symbol
seçeneği hem de --revert
seçeneği belirtilmişse kullanıcının kullandığı semboller yazdırılır.