VNDK tanımlama aracı

VNDK tanım aracı, tedarikçilerin kaynak ağaçlarını Android 8.0 ortamına taşımalarına yardımcı olur. Bu araç, sistemdeki ve tedarikçi firma resimlerindeki ikili dosyaları tarar, ardından bağımlılıkları çözer. Modül bağımlılık grafiğine dayalı olarak araç, VNDK kavramlarının ihlallerini de algılayabilir ve modülleri bölümler arasında taşımayla ilgili analizler/öneriler sağlayabilir. Genel sistem görüntüsü (GSI) belirtilirse 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ı için 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 değerlerini hesaplayın.
  • check-dep. Tedarikçi modüllerinden uygun olmayan çerçeve paylaşılan kitaplıklarına kadar ihlal eden modül bağımlılıkları kontrol edin.
  • deps. Paylaşılan kitaplıklar ile 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 Tanım Aracı deposundaki README.md dosyasını inceleyin.

vndk

vndk alt komutu, sistem bölümünden ve tedarikçi 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]'ye kopyalanmaları gereken kitaplıkları belirlemek için modül bağımlılıkları çözer. vndk alt komutu için seçenekler şunlardır:

Option Açıklama
--system Sistem bölümündeki dosyaları içeren bir dizini işaret edin.
--vendor Tedarikçi firma bölümünde bulunan dosyaları içeren bir dizine işaret edin.
--aosp-system Genel sistem resminde (GSI) bulunan dosyaları içeren bir dizini işaret edin.
--load-extra-deps dlopen() gibi, gizli bağımlılıkları açıklayan bir dosyayı 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 işaretinden önceki dosya, iki nokta işaretinden sonraki dosyaya bağlıdır. Örnek:

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

Bu satır, VNDK tanım aracının libart.so'ün libart-compiler.so'e bağlı olduğunu bilmesini sağlar.

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}'e yüklenmelidir
vndk_sp_ext /vendor/lib[64]/vndk-sp'e yüklenmelidir
extra_vendor_libs /vendor/lib[64]'e yüklenmelidir

Sistem şablonları oluşturma

Tedarikçi firma, VNDK tanım aracından çıkışları topladıktan sonra kitaplıkları belirlenen yükleme hedefine kopyalama işlemini otomatikleştirmek için bir Android.mk oluşturup VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES ve EXTRA_VENDOR_LIBRARIES değerlerini 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, tedarikçi firma modüllerini tarar ve bağımlılıklarını kontrol eder. İhlaller tespit ederse ihlal eden bağımlı kitaplık ve simge 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 çıkışta libRS_internal.so ile libmediandk.so arasındaki ihlal eden 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 Uygun bir kitaplık etiketi dosyasına (aşağıda açıklanmıştır) atıfta bulunmalıdır. Bu dosya, Google tarafından sağlanan ve paylaşılan çerçeve kitaplıklarının kategorilerini açıklayan bir e-tablodur.
--module-info Android derleme sistemi tarafından oluşturulan module-info.json dosyasını gösterir. VNDK tanım aracının ikili modülleri kaynak kodla ilişkilendirmesine yardımcı olur.

Uygun kitaplık etiketi dosyası

Google, tedarikçi modülleri tarafından kullanılabilen çerçeve paylaşılan 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 tedarikçi modülleri tarafından kullanılabilen kararlı ABI'ler/API'ler içeren 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ülleri tarafından doğrudan erişilemeyen VNDK-SP bağımlılıkları.
VNDK Tedarikçi modülleri tarafından kullanılabilen çerçeve paylaşılan kitaplıkları (SP-HAL ve SP-HAL-Dep hariç).
VNDK-Private Tüm tedarikçi modülleri tarafından doğrudan erişilemeyen VNDK bağımlılıkları.
FWK-ONLY Tedarikçi modülleri tarafından erişilmemesi gereken (doğrudan veya dolaylı olarak) yalnızca çerçeve paylaşılan kitaplıkları.
FWK-ONLY-RS Tedarikçi modülleri tarafından erişilmemesi gereken, yalnızca çerçeveyle paylaşılan kitaplıklar (RS kullanımları hariç).

Aşağıdaki tabloda, tedarikçi firmanın paylaştığı kitaplıklar için kullanılan etiketler açıklanmaktadır:

Etiketle Açıklama
SP-HAL Aynı işlem HAL uygulamalı paylaşılan kitaplıklar.
SP-HAL-Dep SP-HAL tedarikçi firma paylaşılan kitaplık bağımlılıkları (LL-NDK ve VNDK-SP hariç SP-HAL bağımlılıkları olarak da bilinir).
VND-ONLY Çerçeve modülleri tarafından erişilmemesi gereken, çerçeveye görünmeyen paylaşılan kitaplıklar. Kopyalanan genişletilmiş VNDK kitaplıkları da YALNIZCA-VND olarak etiketlenir.

Etiketler arasındaki ilişkiler:

Etiketler arasındaki ilişkiler.

Şekil 1. Etiketler arasındaki ilişkiler.

deps

Kitaplık bağımlılıklarında hata ayıklama yapmak 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üm başlatır. Sekme karakteri içeren satır, önceki bölüme bağlıdır. Örnek:

/system/lib/ld-android.so
/system/lib/libc.so
        /system/lib/libdl.so

Bu çıkış, ld-android.so'ün bağımlılığının olmadığını ve libc.so'un libdl.so'ye bağlı olduğunu gösterir.

--revert seçeneği belirtildiğinde deps alt komutu, kitaplıkların kullanımları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

Örnek:

/system/lib/ld-android.so
        /system/lib/libdl.so
        

Bu çıkış, ld-android.so'ün libdl.so tarafından kullanıldığını veya başka bir deyişle libdl.so'ün ld-android.so'e bağlı olduğunu gösterir. Ayrıca bu çıkışta, libdl.so'in ld-android.so'un tek kullanıcısı olduğu da gösterilir.

--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
    

Örnek:

/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'ün libdl.so'ten dışa aktarılan altı işleve bağlı olduğunu gösterir. Hem --symbol hem de --revert seçeneği belirtilirse kullanıcı tarafından kullanılan semboller yazdırılır.