वीएनडीके परिभाषा उपकरण

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

यह अनुभाग VNDK परिभाषा उपकरण के लिए अक्सर उपयोग किए जाने वाले तीन आदेशों को शामिल करता है:

  • vndk . एंड्रॉइड 8.0 और उच्चतर में सिस्टम वर्कअराउंड बनाने के लिए VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES और EXTRA_VENDOR_LIBRARIES की गणना करें।
  • check-dep । विक्रेता मॉड्यूल से गैर-योग्य फ़्रेमवर्क साझा लाइब्रेरीज़ तक उल्लंघनकारी मॉड्यूल निर्भरता की जाँच करें।
  • deps । साझा पुस्तकालयों और निष्पादनयोग्यों के बीच निर्भरताएँ प्रिंट करें।

उन्नत कमांड उपयोग के बारे में अधिक जानकारी के लिए, VNDK डेफिनिशन टूल रिपॉजिटरी में README.md फ़ाइल देखें।

vndk

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

विकल्प विवरण
--system उस निर्देशिका की ओर इंगित करें जिसमें वे फ़ाइलें हैं जो सिस्टम विभाजन में रहेंगी।
--vendor उस निर्देशिका की ओर इंगित करें जिसमें वे फ़ाइलें हैं जो विक्रेता विभाजन में रहेंगी।
--aosp-system उस निर्देशिका की ओर इंगित करें जिसमें वे फ़ाइलें हैं जो जेनेरिक सिस्टम इमेज (जीएसआई) में रहेंगी।
--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 परिभाषा उपकरण निम्नलिखित श्रेणियों के लिए पुस्तकालयों और संबंधित इंस्टॉल निर्देशिकाओं को सूचीबद्ध करता है:

वर्ग निर्देशिका
vndk_sp /system/lib[64]/vndk-sp-${VER} पर इंस्टॉल करना होगा
vndk_sp_ext /vendor/lib[64]/vndk-sp पर इंस्टॉल करना होगा
अतिरिक्त_विक्रेता_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 एंड्रॉइड बिल्ड सिस्टम द्वारा उत्पन्न module-info.json की ओर इशारा करता है। यह VNDK परिभाषा उपकरण को स्रोत कोड के साथ बाइनरी मॉड्यूल को जोड़ने में मदद करता है।

योग्य लाइब्रेरी टैग फ़ाइल

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

टैग विवरण
एलएल-एनडीके स्थिर एबीआई/एपीआई के साथ साझा लाइब्रेरी जिनका उपयोग फ्रेमवर्क और विक्रेता मॉड्यूल दोनों द्वारा किया जा सकता है।
एलएल-एनडीके-प्राइवेट एलएल-एनडीके पुस्तकालयों की निजी निर्भरताएँ। विक्रेता मॉड्यूल को इन पुस्तकालयों तक सीधे नहीं पहुंचना चाहिए।
वीएनडीके-एसपी एसपी-एचएएल ढांचे ने पुस्तकालयों की निर्भरता साझा की।
वीएनडीके-एसपी-प्राइवेट वीएनडीके-एसपी निर्भरताएं जो सभी विक्रेता मॉड्यूल के लिए सीधे पहुंच योग्य नहीं हैं।
वीएनडीके फ़्रेमवर्क साझा लाइब्रेरीज़ जो विक्रेता मॉड्यूल के लिए उपलब्ध हैं (एसपी-एचएएल और एसपी-एचएएल-डिप को छोड़कर)।
वीएनडीके-प्राइवेट VNDK निर्भरताएँ जो सभी विक्रेता मॉड्यूल तक सीधे पहुंच योग्य नहीं हैं।
FWK-केवल फ़्रेमवर्क-केवल साझा लाइब्रेरीज़ जिन्हें विक्रेता मॉड्यूल द्वारा एक्सेस नहीं किया जाना चाहिए (न तो प्रत्यक्ष और न ही अप्रत्यक्ष रूप से)।
एफडब्ल्यूके-केवल-आरएस फ़्रेमवर्क-केवल साझा लाइब्रेरीज़ जिन्हें विक्रेता मॉड्यूल द्वारा एक्सेस नहीं किया जाना चाहिए (आरएस उपयोगों को छोड़कर)।

निम्न तालिका विक्रेता साझा पुस्तकालयों के लिए उपयोग किए गए टैग का वर्णन करती है:

टैग विवरण
एसपी-एचएएल समान-प्रक्रिया एचएएल कार्यान्वयन साझा लाइब्रेरी।
एसपी-एचएएल-डिपा एसपी-एचएएल विक्रेता ने लाइब्रेरी निर्भरताएं साझा कीं (एलएल-एनडीके और वीएनडीके-एसपी को छोड़कर उर्फ ​​एसपी-एचएएल निर्भरताएं)।
केवल वीएनडी फ़्रेमवर्क-अदृश्य साझा लाइब्रेरीज़ जिन्हें फ़्रेमवर्क मॉड्यूल द्वारा एक्सेस नहीं किया जाना चाहिए। कॉपी की गई विस्तारित VNDK लाइब्रेरीज़ को VND-ONLY के रूप में भी टैग किया जाएगा।

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

टैग के बीच संबंध.
चित्र 1. टैग के बीच संबंध.

विभाग

लाइब्रेरी निर्भरता को डीबग करने के लिए, 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 से निर्यात किए गए 6 फ़ंक्शन पर निर्भर करता है। यदि --symbol विकल्प और --revert विकल्प दोनों निर्दिष्ट हैं, तो उपयोगकर्ता द्वारा उपयोग किए गए प्रतीक मुद्रित किए जाएंगे।