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 के लिए भी. |
टैग के बीच संबंध:
![टैग के बीच संबंध.](https://source.android.com/docs/core/architecture/images/treble_vndk_design.png?authuser=1&hl=hi)
पहला डायग्राम. टैग के बीच संबंध.
डिप
लाइब्रेरी डिपेंडेंसी को डीबग करने के लिए, 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
विकल्प बताया गया है, जो उपयोगकर्ता ने इस्तेमाल किए हैं
प्रिंट किए जाते हैं.