VNDK Tanımlama Aracı

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

VNDK tanımlama aracı, satıcıların kaynak ağaçlarını bir Android 8.0 ortamına geçirmelerine yardımcı olur. Bu araç, sistemdeki ikili dosyaları ve satıcı görüntülerini tarar ve ardından bağımlılıkları çözer. Araç, modül bağımlılık grafiğine dayalı olarak, VNDK kavramlarına yönelik ihlalleri de algılayabilir ve modülleri bölümler arasında taşımak için içgörü/öneriler sağlayabilir. Bir 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şımlı kitaplıklara 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ı hakkında 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ünden 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] 'a kopyalanması gereken kitaplıkları belirlemek için modül bağımlılıklarını çözer. /vendor/lib[64] . vndk alt komutu için seçenekler şunları içerir:

Seçenek Tanım
--system Sistem bölümünde bulunacak dosyaları içeren bir dizine gelin.
--vendor Bir satıcı bölümünde bulunacak dosyaları içeren bir dizine gelin.
--aosp-system Genel Sistem Görüntüsü'nde (GSI) bulunacak dosyaları içeren bir dizine gelin.
--load-extra-deps dlopen() gibi örtük bağımlılıkları açıklayan bir dosyaya gelin.

Ö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 ekstra bağımlılıkları belirtin. Her satır, iki nokta üst üste işaretinden sonraki dosyaya bağlı olarak iki nokta üst üste işaretinden önceki dosyayla bir ilişkiyi temsil eder. Örneğin:

/system/lib/libart.so: /system/lib/libart-compiler.so

Bu satır, VNDK tanımlama aracının libart.so bağlı olduğunu libart-compiler.so .

Kurulum hedefi

VNDK tanımlama 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}
vndk_sp_ext /vendor/lib[64]/vndk-sp
extra_vendor_libs /vendor/lib[64] e kurulmalıdır

Sistem şablonları oluşturun

Bir satıcı, VNDK tanımlama aracından çıktıları topladıktan sonra, bir Android.mk oluşturabilir ve kitaplıkları belirlenen yükleme hedefine kopyalama işlemini otomatikleştirmek için VNDK_SP_LIBRARIES , VNDK_SP_EXT_LIBRARIES ve EXTRA_VENDOR_LIBRARIES 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 ile libmediandk.so arasında ihlal eden bir bağımlılığı gösterir:

/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 şunları içerir:

Seçenek Tanım
--tag-file Çerçeve paylaşılan kitaplık 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) atıfta bulunmalıdır.
--module-info Android derleme sistemi tarafından oluşturulan module-info.json . 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şımlı kitaplıkları etiketleyen uygun bir VNDK elektronik tablosu (örneğin 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'lere/API'lere sahip 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üllerine doğrudan erişilemeyen VNDK-SP bağımlılıkları.
VNDK Satıcı modülleri tarafından kullanılabilen çerçeve paylaşımlı kitaplıklar (SP-HAL ve SP-HAL-Dep hariç).
VNDK-Özel Tüm satıcı modüllerine doğrudan erişilemeyen VNDK bağımlılıkları.
FWK-SADECE Satıcı modülleri tarafından erişilmemesi gereken (doğrudan veya dolaylı olarak) yalnızca çerçeve paylaşımlı kitaplıklar.
FWK-SADECE-RS Satıcı modülleri tarafından erişilmemesi gereken yalnızca çerçeve paylaşımlı kitaplıklar (RS kullanımları hariç).

Aşağıdaki tabloda, satıcı tarafından paylaşılan kitaplıklar için kullanılan etiketler açıklanmaktadır:

Etiket Tanım
SP-HAL Aynı işlem HAL uygulaması paylaşılan kitaplıkları.
SP-HAL-Dep SP-HAL satıcısı paylaşılan kitaplık bağımlılıkları (LL-NDK ve VNDK-SP hariç diğer adıyla SP-HAL bağımlılıkları).
SADECE VND Çerçeve modülleri tarafından erişilmemesi gereken, çerçeve içinde görünmez paylaşılan kitaplıklar. Kopyalanan genişletilmiş VNDK kitaplıkları da YALNIZCA VND olarak etiketlenecektir.

Etiketler arasındaki ilişkiler:

Şekil 1. 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

Çıktı birden çok satırdan oluşur. Sekme karakteri olmayan satır yeni bir bölüm başlatır. Sekme karakteri olan 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ığı olmadığını ve libc.so libdl.so olduğunu gösterir.

--revert seçeneği belirtilirken, deps alt komutu kitaplıkların kullanımlarını yazdırır (ters bağımlılıklar):

./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 kullanıldığını veya başka bir deyişle libdl.so ld-android.so olduğunu gösterir. Ek olarak, bu çıktı libdl.so öğesinin tek kullanıcısı olduğunu ld-android.so .

--symbol seçeneğini belirtirken, 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.