VNDK tanımlama aracı

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:

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.