VNDK Tanımlama Aracı

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:

Etiketler arasındaki ilişkiler.
Şekil 1. 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.