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

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

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

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

एडवांस कमांड के इस्तेमाल के बारे में ज़्यादा जानने के लिए, VNDK Definition Tool की रिपॉज़िटरी में मौजूद README.md फ़ाइल देखें.

vndk

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

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

इंस्टॉल करने का डेस्टिनेशन

वीएनडीके डेफ़िनिशन टूल, इन कैटगरी के लिए लाइब्रेरी और उनसे जुड़ी इंस्टॉल डायरेक्ट्री की सूची दिखाता है:

कैटगरी डायरेक्ट्री
vndk_sp /system/lib[64]/vndk-sp-${VER} पर इंस्टॉल होना चाहिए
vndk_sp_ext /vendor/lib[64]/vndk-sp पर इंस्टॉल होना चाहिए
extra_vendor_libs /vendor/lib[64] पर इंस्टॉल होना चाहिए

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

वीएनडीके डेफ़िनिशन टूल से आउटपुट इकट्ठा करने के बाद, वेंडर 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

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, वीएनडीके की ज़रूरी शर्तें पूरी करने वाली एक स्प्रेडशीट (जैसे, eligible-list.csv) उपलब्ध कराता है. यह स्प्रेडशीट, फ़्रेमवर्क की उन शेयर की गई लाइब्रेरी को टैग करती है जिनका इस्तेमाल वेंडर मॉड्यूल कर सकते हैं:

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

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

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

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

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

पहली इमेज. टैग के बीच संबंध.

deps

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