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

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

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