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:
Ş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.