VNDK tanımlama aracı

VNDK tanım aracı tedarikçilerin kaynak ağaçlarını bir Android 8.0 ortamı. Bu araç, sistemdeki ve tedarikçi firmadaki ikili dosyaları tarar. bağımlılıkları çözer. Modül bağımlılık grafiğine göre araç, VNDK kavramlarının ihlal edildiği durumları tespit edip analizler/öneriler içerir. Genel bir sistem Resim (GSI) belirtilmiş, VNDK tanımlama aracı, sisteminizi karşılaştırabilir resmi ile GSI'yı yükleyin ve genişletilmiş kitaplıkları belirleyin.

Bu bölümde VNDK tanımı için sık kullanılan üç komut ele alınmaktadır araç:

  • vndk VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES ve Android 8.0 ve sonraki sürümlerde derleme sistemiyle ilgili geçici çözüm için Extra_VENDOR_LIBRARIES daha yüksek.
  • check-dep İhlale neden olan modül bağımlılıklarını şuradan kontrol edin: çerçevelerini uygun olmayan paylaşılan kitaplıklara aktarmanızı sağlar.
  • deps Paylaşılan kitaplıklar ve yürütülebilir dosyalar.

Gelişmiş komut kullanımıyla ilgili daha fazla ayrıntı için BENİOKU.md dosyasını yükleyin.

Vndk

vndk alt komutu, paylaşılan kitaplıkları ve yürütülebilir dosyaları yükler azaltıp devre dışı bırakır ve bağımlılarını belirleyerek /system/lib[64]/vndk-sp-${VER} ve /vendor/lib[64]. vndk alt komutu için seçenekler şunlardır:

Option Açıklama
--system Sistemde bulunan dosyaları içeren dizine gidin. bölüm.
--vendor Tedarikçi firmada bulunan dosyaları içeren dizinin üzerine gelin bölüm.
--aosp-system Genel dizinde bulunan dosyaları içeren bir dizinin üzerine gelin sistem görüntüsü (GSI) ile ilişkilidir.
--load-extra-deps Örneğin, dlopen()

Örneğin, VNDK kitaplık kümelerini hesaplamak için şu komutu çalıştırın: vndk alt komut:

./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çimi kullanarak ekstra bağımlılıkları belirtin. Her satır bir ile, iki nokta üst üste. Örnek:

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

Bu satır, VNDK tanımlama aracının libart.so şuna bağlıdır: libart-compiler.so.

Yükleme hedefi

VNDK tanımlama aracı, kitaplıkları ve ilgili yükleme dizinlerini listeler şu kategorilerde geçerli:

Kategori Dizin
vndk_sp /system/lib[64]/vndk-sp-${VER} hizmetine yüklenmelidir
vndk_sp_ext /vendor/lib[64]/vndk-sp hizmetine yüklenmelidir
ekstra_sağlayıcı_libreler /vendor/lib[64] hizmetine yüklenmelidir

Sistem şablonları oluşturma

Tedarikçi, VNDK tanım aracından çıktıları topladıktan sonra bir tedarikçi firmanın Android.mk ve VNDK_SP_LIBRARIES alanını doldurun, VNDK_SP_EXT_LIBRARIES ve EXTRA_VENDOR_LIBRARIES - kitaplıkları belirlenen yüklemeye kopyalama işlemini otomatikleştirme seçeceğiz.

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

danışmanlığı

check-dep alt komutu, tedarikçi modüllerini tarar ve ve bildirmeyi konuştuk. İhlal tespit ederse ihlalde bulunan bağımlı öğeyi yazdırır kitaplık ve simge kullanımları:

./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, kaynak kodundan ihlalde bulunan libRS_internal.so - libmediandk.so:

/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 etiket dosyasına (aşağıda açıklanmıştır) başvurmalıdır. Bu, Google tarafından sağlanan, paylaşılan çerçeve kategorilerini açıklayan e-tablo kitaplıklar.
--module-info Android derlemesi tarafından oluşturulan module-info.json için puan bahsedeceğim. VNDK tanım aracının ikili modülleri kaynakla ilişkilendirmesine yardımcı olur girin.

Uygun kitaplık etiketi dosyası

Google, uygun bir VNDK e-tablosu (ör. eligible-list.csv) içerir. nasıl yararlanabileceğine bakalım:

Etiketle Açıklama
LL-NDK Her ikisi tarafından da kullanılabilen, kararlı ABI'lere/API'lere sahip paylaşılan kitaplıklar modüllerini inceleyeceğiz.
LL-NDK-Gizli LL-NDK kitaplıklarının özel bağımlılıkları. Satıcı modüllerine erişim izni verilemez yardımcı olur.
VNDK-SP SP-HAL çerçevesi paylaşılan kitaplık bağımlılıkları.
VNDK-SP-Özel Tüm tedarikçi firma tarafından doğrudan erişilemeyen VNDK-SP bağımlılıkları modüllerinde yer alır.
VNDK Tedarikçi modülleri için kullanılabilen çerçeve paylaşılan kitaplıkları ( SP-HAL ve SP-HAL-Dep).
VNDK-Özel Tüm tedarikçilerin doğrudan erişemediği VNDK bağımlılıkları modüllerinde yer alır.
YALNIZCA FWK Satıcı tarafından erişilmemesi gereken, yalnızca çerçeve için paylaşılan kitaplıklar (doğrudan ne dolaylı olarak değil).
YALNIZCA FWK-RSK Satıcı tarafından erişilmemesi gereken, yalnızca çerçeve için paylaşılan kitaplıklar modüllerinde yer alır (RS kullanımları hariç).

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

Etiketle Açıklama
SP-HAL Aynı işlemle HAL uygulaması paylaşılan kitaplıkları.
SP-HAL-Dep SP-HAL tedarikçisi paylaşılan kitaplık bağımlılıkları (SP-HAL bağımlılıkları olarak da adlandırılır) LL-NDK ve VNDK-SP hariç).
YALNIZCA VND tarafından erişilmemesi gereken, çerçeve tarafından görülmeyen paylaşılan kitaplıklar çerçeve modüllerini. Kopyalanan genişletilmiş VNDK kitaplıkları şu şekilde etiketlenir: YALNIZCA VND olarak da kullanılabilir.

Etiketler arasındaki ilişkiler:

Etiketler arasındaki ilişkiler.

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

kalkış noktaları

Kitaplık bağımlılıklarında hata ayıklamak için deps alt komutu yazdırılır üç önemli noktayı açıkladık:

./vndk_definition_tool.py deps \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

Çıkış birden çok 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 sekmeye bölümüne ekleyin. Örnek:

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

Bu çıkış, ld-android.so öğesinin bir bağımlılığı olmadığını gösteriyor ve libc.so libdl.so metriğine bağlıdır.

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

./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 öğesinin libdl.so; diğer bir deyişle libdl.so, ld-android.so Ayrıca bu çıkış, libdl.so, ld-android.so alanının tek kullanıcısı.

--symbol seçeneği belirtilirken, deps alt komut, kullanılan simgeleri 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 işlevinin dışa aktarılan altı işleve bağlı olduğunu gösteriyor libdl.so başlangıç fiyatıyla. Hem --symbol seçeneği hem de Kullanıcının kullandığı simgeler için --revert seçeneği belirtildi yazdırılır.