VNDK डेफ़िनिशन टूल

VNDK डेफ़िनिशन टूल, वेंडर को अपने सोर्स ट्री को Android 8.0 एनवायरमेंट. यह टूल, सिस्टम और वेंडर में बाइनरी फ़ाइलों को स्कैन करता है इमेज के ज़रिए डिपेंडेंसी का समाधान किया जाता है. मॉड्यूल डिपेंडेंसी ग्राफ़ के आधार पर, यह टूल, VNDK सिद्धांतों के उल्लंघन का पता लगाने और सेगमेंट के बीच मॉड्यूल को ले जाने के लिए अहम जानकारी/सुझाव. अगर सामान्य सिस्टम इमेज (जीएसआई) के बारे में बताया गया है. VNDK डेफ़िनिशन टूल आपके सिस्टम की तुलना कर सकता है को GSI के साथ सबमिट किया जा सकता है और एक्सटेंडेड लाइब्रेरी का पता लगाया जा सकता है.

इस सेक्शन में, VNDK की परिभाषा के लिए, अक्सर इस्तेमाल किए जाने वाले तीन कमांड के बारे में बताया गया है टूल:

  • vndk. VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES, और कंप्यूट करें Android 8.0 और Android 8.0 और उच्च.
  • check-dep. इनकी मदद से, उल्लंघन करने वाले मॉड्यूल डिपेंडेंसी की जांच करें ज़रूरी शर्तें पूरी न करने वाले फ़्रेमवर्क को शेयर की गई लाइब्रेरी के लिए वेंडर मॉड्यूल.
  • deps. डिपेंडेंसी को शेयर की गई लाइब्रेरी और एक्ज़ीक्यूटेबल.

बेहतर कमांड के इस्तेमाल के बारे में ज़्यादा जानने के लिए, यह देखें README.md फ़ाइल को VNDK परिभाषा टूल रिपॉज़िटरी में भेज दिया जाएगा.

वीएनडीके

vndk सबकमांड, शेयर की गई लाइब्रेरी और एक्ज़ीक्यूटेबल को लोड करता है इस विकल्प का इस्तेमाल, सिस्टम पार्टिशन और वेंडर पार्टिशन से किया जाता है. इसके बाद, मॉड्यूल को रिज़ॉल्व किया जाता है डिपेंडेंसी का इस्तेमाल करके उन लाइब्रेरी का पता लगाया जाता है जिन्हें कॉपी किया जाना चाहिए /system/lib[64]/vndk-sp-${VER} और /vendor/lib[64]. vndk सबकमांड के विकल्पों में ये शामिल हैं:

विकल्प ब्यौरा
--system कर्सर को उस डायरेक्ट्री पर ले जाएं जिसमें सिस्टम में मौजूद फ़ाइलें हैं विभाजन.
--vendor उस डायरेक्ट्री पर कर्सर ले जाएं जिसमें वेंडर में मौजूद फ़ाइलें हैं विभाजन.
--aosp-system उस डायरेक्ट्री पर कर्सर ले जाएं जिसमें जेनरिक में मौजूद फ़ाइलें हैं सिस्टम इमेज (GSI).
--load-extra-deps ऐसी फ़ाइल पर पॉइंट करें जो इंप्लिसिट डिपेंडेंसी के बारे में बताती हो, जैसे dlopen().

उदाहरण के लिए, VNDK लाइब्रेरी सेट को कंप्यूट करने के लिए, नीचे दिया गया तरीका अपनाएं vndk सबकमांड:

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

आसान फ़ाइल फ़ॉर्मैट का इस्तेमाल करके, अतिरिक्त डिपेंडेंसी तय करें. हर लाइन संबंध, कोलन से पहले फ़ाइल के साथ कोलन. उदाहरण के लिए:

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

इस लाइन से VNDK के डेफ़िनिशन टूल को पता चलता है कि libart.so libart-compiler.so पर निर्भर करता है.

इंस्टॉल करने की जगह

VNDK परिभाषा टूल, लाइब्रेरी और उनसे जुड़ी इंस्टॉल डायरेक्ट्री की सूची बनाता है कैटगरी तय करती है:

कैटगरी डायरेक्ट्री
वॉन्डके_एसपी /system/lib[64]/vndk-sp-${VER} पर इंस्टॉल करना ज़रूरी है
Vndk_sp_ext /vendor/lib[64]/vndk-sp पर इंस्टॉल करना ज़रूरी है
अतिरिक्त_vendor_libs /vendor/lib[64] पर इंस्टॉल करना ज़रूरी है

सिस्टम टेंप्लेट बनाएं

VNDK डेफ़िनिशन टूल से आउटपुट इकट्ठा करने के बाद, वेंडर Android.mk और VNDK_SP_LIBRARIES भरें, VNDK_SP_EXT_LIBRARIES और EXTRA_VENDOR_LIBRARIES को लाइब्रेरी को तय किए गए इंस्टॉलेशन में कॉपी करने की प्रोसेस को ऑटोमेट करता है गंतव्य.

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 सबकमांड, वेंडर मॉड्यूल को स्कैन करता है और निर्भरता. यह नीति, उल्लंघन का पता चलने पर, उल्लंघन करने वाले डिपेंडेंट को प्रिंट करती है लाइब्रेरी और सिंबल का इस्तेमाल:

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

उदाहरण के लिए, नीचे दिया गया सैंपल आउटपुट, 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 सबकमांड के विकल्पों में ये शामिल हैं:

विकल्प ब्यौरा
--tag-file किसी योग्य लाइब्रेरी टैग फ़ाइल (नीचे बताया गया है) से संदर्भ लेना चाहिए, जो Google की ओर से दी गई स्प्रेडशीट, जिसमें शेयर किए गए फ़्रेमवर्क की कैटगरी की जानकारी दी गई है लाइब्रेरी.
--module-info Android बिल्ड से जनरेट हुए module-info.json पर ले जाता है सिस्टम. यह वीएनडीके डेफ़िनिशन टूल को बाइनरी मॉड्यूल को सोर्स से जोड़ने में मदद करता है कोड.

इस्तेमाल की जा सकने वाली लाइब्रेरी टैग फ़ाइल

Google, ज़रूरी शर्तें पूरी करने वाली VNDK स्प्रेडशीट उपलब्ध कराता है. उदाहरण के लिए, eligible-list.csv) जो उस फ़्रेमवर्क को शेयर की गई लाइब्रेरी को टैग करती है जो का इस्तेमाल वेंडर मॉड्यूल में किया जा सकता है:

टैग करें ब्यौरा
एलएल-एनडीके स्थायी एबीआई/एपीआई वाली शेयर की गई लाइब्रेरी, जिनका इस्तेमाल दोनों में किया जा सकता है फ़्रेमवर्क और वेंडर मॉड्यूल.
एलएल-एनडीके-प्राइवेट LL-NDK लाइब्रेरी की निजी डिपेंडेंसी. वेंडर मॉड्यूल को ऐक्सेस नहीं करना चाहिए का उपयोग कर सकते हैं.
वीएनडीके-एसपी SP-HAL फ़्रेमवर्क शेयर की गई लाइब्रेरी डिपेंडेंसी.
वीएनडीके-एसपी-प्राइवेट VNDK-SP डिपेंडेंसी, जिन्हें सभी वेंडर सीधे तौर पर ऐक्सेस नहीं कर सकते मॉड्यूल देखें.
वियतनामीज़ डोंग वेंडर मॉड्यूल के लिए उपलब्ध फ़्रेमवर्क से शेयर की गई लाइब्रेरी SP-HAL और SP-HAL-Dep.
VNDK-निजी VNDK डिपेंडेंसी, जिसे सभी वेंडर सीधे तौर पर ऐक्सेस नहीं कर सकते मॉड्यूल देखें.
सिर्फ़ FWK के लिए सिर्फ़ फ़्रेमवर्क के साथ शेयर की गई लाइब्रेरी, जिन्हें वेंडर ऐक्सेस नहीं कर सकता मॉड्यूल (न तो सीधे तौर पर और न ही किसी दूसरे तरीके से).
सिर्फ़ FWK वाले सिर्फ़ फ़्रेमवर्क के साथ शेयर की गई लाइब्रेरी, जिन्हें वेंडर ऐक्सेस नहीं कर सकता मॉड्यूल (आरएसएस इस्तेमाल को छोड़कर).

यहां दी गई टेबल में, वेंडर की शेयर की गई लाइब्रेरी के लिए इस्तेमाल किए जाने वाले टैग के बारे में बताया गया है:

टैग करें ब्यौरा
एसपी-हॉल शेयर की गई लाइब्रेरी में एचएएल को लागू करने की एक जैसी प्रक्रिया.
एसपी-हॉल-डेप SP-HAL वेंडर की शेयर की गई लाइब्रेरी डिपेंडेंसी (इन्हें SP-HAL डिपेंडेंसी भी कहा जाता है) इसमें LL-NDK और VNDK-SP शामिल नहीं हैं.
सिर्फ़ वियतनामीज़ डोंग फ़्रेमवर्क-नहीं दिखने वाली शेयर की गई लाइब्रेरी जिन्हें ऐक्सेस नहीं करना चाहिए फ़्रेमवर्क मॉड्यूल का इस्तेमाल करें. कॉपी की गई बढ़ाई गई VNDK लाइब्रेरी, इस तौर पर टैग की गई हैं सिर्फ़ VND के लिए भी.

टैग के बीच संबंध:

टैग के बीच संबंध.

पहला डायग्राम. टैग के बीच संबंध.

डिप

लाइब्रेरी डिपेंडेंसी को डीबग करने के लिए, deps सबकमांड प्रिंट मॉड्यूल डिपेंडेंसी:

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

आउटपुट में कई लाइनें होती हैं. बिना टैब वर्ण वाली लाइन नया सेक्शन शुरू करता है. टैब वर्ण वाली लाइन, इससे पहले वाले वर्ण पर निर्भर करती है सेक्शन में जाएं. उदाहरण के लिए:

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

इस आउटपुट से पता चलता है कि ld-android.so पर कोई डिपेंडेंसी नहीं है और libc.so, libdl.so पर निर्भर करता है.

--revert विकल्प तय करने के दौरान, deps सबकमांड, लाइब्रेरी के इस्तेमाल को प्रिंट करते हैं (इसके उलट डिपेंडेंसी):

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

उदाहरण के लिए:

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

इस आउटपुट से पता चलता है कि ld-android.so का इस्तेमाल यह करता है libdl.so या दूसरे शब्दों में, libdl.so इस पर निर्भर करता है ld-android.so. साथ ही, इस आउटपुट से पता चलता है कि libdl.so, ld-android.so का अकेला उपयोगकर्ता है.

--symbol विकल्प को तय करने पर, deps सबकमांड, इस्तेमाल किए जा रहे सिंबल को प्रिंट करता है:

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

उदाहरण के लिए:

/system/lib/libc.so
        /system/lib/libdl.so
                android_get_application_target_sdk_version
                dl_unwind_find_exidx
                dlclose
                dlerror
                dlopen
                dlsym

इस आउटपुट से पता चलता है कि libc.so, एक्सपोर्ट किए गए छह फ़ंक्शन पर निर्भर करता है libdl.so से. अगर --symbol विकल्प और --revert विकल्प बताया गया है, जो उपयोगकर्ता ने इस्तेमाल किए हैं प्रिंट किए जाते हैं.