VNDK tanımlama aracı, satıcıların kaynak ağaçlarını Android 8.0 ortamına taşımalarına yardımcı olur. Bu araç, sistemdeki ikili dosyaları ve satıcı görsellerini tarar ve ardından bağımlılıkları çözer. Araç, modül bağımlılığı grafiğine dayanarak VNDK kavramlarına yönelik ihlalleri de tespit edebilir ve modüllerin bölümler arasında taşınmasına ilişkin öngörü/öneriler sağlayabilir. Genel Sistem Görüntüsü (GSI) belirtilirse VNDK tanımlama aracı, sistem görüntünüzü GSI ile karşılaştırabilir ve genişletilmiş kitaplıkları belirleyebilir.
Bu bölüm, VNDK tanımlama aracı için sık kullanılan üç komutu kapsar:
-
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 ihlal eden 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ına ilişkin daha fazla ayrıntı için VNDK Tanımlama Aracı deposundaki README.md dosyasına bakın.
vndk
vndk
alt komutu, sistem bölümü ve satıcı 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]
dizinine kopyalanması gereken kitaplıkları belirlemek için modül bağımlılıklarını çözer. /vendor/lib[64]
. vndk
alt komutuna ilişkin seçenekler şunları içerir:
Seçenek | Tanım |
---|---|
--system | Sistem bölümünde yer alacak dosyaları içeren dizini işaretleyin. |
--vendor | Satıcı bölümünde yer alacak dosyaları içeren dizini işaretleyin. |
--aosp-system | Genel Sistem Görüntüsünde (GSI) yer alacak dosyaları içeren dizini işaretleyin. |
--load-extra-deps | dlopen() gibi örtülü bağımlılıkları açıklayan bir dosyanın üzerine gelin. |
Örneğin, VNDK kitaplığı 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 formatıyla ekstra bağımlılıkları belirtin. Her satır, iki nokta üst üste işaretinden önceki dosya ile iki nokta üst üste işaretinden sonraki dosyaya bağlı olarak bir ilişkiyi temsil eder. Örneğin:
/system/lib/libart.so: /system/lib/libart-compiler.so
Bu satır, VNDK tanım aracının libart.so
libart-compiler.so
bağlı olduğunu bilmesini sağlar.
Kurulum hedefi
VNDK tanımlama aracı, aşağıdaki kategoriler için kitaplıkları ve ilgili kurulum dizinlerini listeler:
Kategori | Rehber |
---|---|
vndk_sp | /system/lib[64]/vndk-sp-${VER} kurulmalıdır |
vndk_sp_ext | /vendor/lib[64]/vndk-sp kurulmalıdır |
extra_vendor_libs | /vendor/lib[64] dizinine kurulmalıdır |
Sistem şablonları oluşturun
Satıcı, VNDK tanımlama aracından çıktılar topladıktan sonra bir Android.mk
oluşturabilir ve kitaplıkları belirlenen kurulum hedefine kopyalama işlemini otomatikleştirmek için VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
ve EXTRA_VENDOR_LIBRARIES
alanlarını 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 satıcı modüllerini tarar ve bağımlılıklarını kontrol eder. İhlalleri tespit ederse ihlal eden 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ı libRS_internal.so
libmediandk.so
ihlal eden bir bağımlılığı göstermektedir:
/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 komutuna ilişkin seçenekler şunları içerir:
Seçenek | Tanım |
---|---|
--tag-file | Çerçeve paylaşılan kitaplıklarının kategorilerini açıklayan, Google tarafından sağlanan 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 işaret eder. VNDK tanımlama 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 çerçeve paylaşılan kitaplıklarını etiketleyen uygun bir VNDK e-tablosu (örn. eligible-list.csv
) sağlar:
Etiket | Tanım |
---|---|
LL-NDK | Hem çerçeve hem de satıcı modülleri tarafından kullanılabilen kararlı ABI'ler/API'ler içeren paylaşılan kitaplıklar. |
LL-NDK-Özel | LL-NDK kitaplıklarının özel bağımlılıkları. Satıcı 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-Özel | Tüm satıcı modülleri tarafından doğrudan erişilemeyen VNDK-SP bağımlılıkları. |
VNDK | Satıcı modüllerinin kullanabileceği çerçeve paylaşımlı kitaplıkları (SP-HAL ve SP-HAL-Dep hariç). |
VNDK-Özel | Tüm satıcı modülleri tarafından doğrudan erişilemeyen VNDK bağımlılıkları. |
SADECE FWK | Satıcı modülleri tarafından (doğrudan veya dolaylı olarak) erişilmemesi gereken, yalnızca çerçeveyle paylaşılan kitaplıklar. |
SADECE FWK-RS | Satıcı modülleri tarafından erişilmemesi gereken, yalnızca çerçeveyle paylaşılan kitaplıklar (RS kullanımları hariç). |
Aşağıdaki tabloda satıcının paylaştığı kitaplıklar için kullanılan etiketler açıklanmaktadır:
Etiket | Tanım |
---|---|
SP-HAL | Aynı süreç HAL uygulaması paylaşılan kitaplıkları. |
SP-HAL-Dep | SP-HAL satıcısı paylaşılan kitaplık bağımlılıkları (diğer adıyla LL-NDK ve VNDK-SP hariç SP-HAL bağımlılıkları). |
SADECE VND | Çerçeve modülleri tarafından erişilmemesi gereken, çerçevenin görünmez olduğu paylaşılan kitaplıklar. Kopyalanan genişletilmiş VNDK kitaplıkları da SADECE VND olarak etiketlenecektir. |
Etiketler arasındaki ilişkiler:
derinlik
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
Çıktı birden fazla satırdan oluşur. Sekme karakteri olmayan satır yeni bir bölüm başlatır. Sekme karakterli 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
bir bağımlılığa sahip olmadığını ve libc.so
libdl.so
bağlı olduğunu gösterir.
--revert
seçeneğini belirlerken, deps
alt komutu kitaplıkların kullanımlarını (tersine çevrilmiş 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
libdl.so
tarafından kullanıldığını veya başka bir deyişle libdl.so
ld-android.so
bağlı olduğunu gösterir. Ek olarak, bu çıktı libdl.so
ld-android.so
tek kullanıcısı olduğunu gösterir.
--symbol
seçeneğini belirlerken, 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 çıktı, libc.so
libdl.so
dışa aktarılan 6 işleve bağlı olduğunu gösterir. Hem --symbol
seçeneği hem de --revert
seçeneği belirtilirse kullanıcı tarafından kullanılan semboller yazdırılacaktır.