VNDK সংজ্ঞা টুল

VNDK সংজ্ঞা টুল, ভেন্ডরদের সোর্স ট্রিকে Android 8.0 এনভায়রনমেন্টে মাইগ্রেট করতে সাহায্য করে। এই টুলটি সিস্টেমের বাইনারি ফাইল এবং ভেন্ডর ইমেজ স্ক্যান করে, তারপরে ডিপেন্ডেন্সি সমাধান করে। মডিউল নির্ভরতা গ্রাফের উপর ভিত্তি করে, টুলটি VNDK কনসেপ্টের লঙ্ঘনও ডিটেক্ট করতে পারে এবং পার্টিশনের মধ্যে মডিউল সরানোর জন্য ইনসাইট/সাজেশন প্রদান করতে পারে। কোনও জেনেরিক সিস্টেম ইমেজ (GSI) নির্দিষ্ট করা থাকলে, VNDK ডেফিনেশন টুল আপনার সিস্টেম ইমেজকে GSI-এর সাথে তুলনা করতে এবং এক্সটেন্ডেড লাইব্রেরি নির্ধারণ করতে পারে।

এই বিভাগে VNDK সংজ্ঞা টুলের জন্য তিনটি প্রায়শই ব্যবহৃত কমান্ড কভার করা হয়েছে:

  • vndk. Android 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]-এ কপি করতে হবে এমন লাইব্রেরি নির্ধারণ করতে মডিউল ডিপেন্ডেন্সি সমাধান করে। vndk সাবকমান্ডের বিকল্পের মধ্যে এগুলি অন্তর্ভুক্ত:

Option বর্ণনা
--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 সংজ্ঞা টুল নিম্নলিখিত বিভাগের জন্য লাইব্রেরি এবং সংশ্লিষ্ট ইনস্টল ডিরেক্টরি তালিকাভুক্ত করে:

বিভাগ ডিরেক্টরি
vndk_sp /system/lib[64]/vndk-sp-${VER}-এ ইনস্টল করতে হবে
vndk_sp_ext /vendor/lib[64]/vndk-sp-এ অবশ্যই ইনস্টল করতে হবে
extra_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

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 সাবকমান্ডের বিকল্পের মধ্যে এগুলি অন্তর্ভুক্ত:

Option বর্ণনা
--tag-file উপযুক্ত লাইব্রেরি ট্যাগ ফাইল (নিচে বর্ণনা করা হয়েছে) উল্লেখ করতে হবে, এটি হল Google-এর দেওয়া স্প্রেডশিট যা শেয়ার করা লাইব্রেরির ফ্রেমওয়ার্কের বিভাগ বর্ণনা করে।
--module-info পয়েন্টগুলি Android বিল্ড সিস্টেমের মাধ্যমে module-info.json তৈরি করা হয়েছে। এটি VNDK সংজ্ঞা টুলকে সোর্স কোডের সাথে বাইনারি মডিউল অ্যাসোসিয়েট করতে সাহায্য করে।

উপযুক্ত লাইব্রেরি ট্যাগ ফাইল

Google একটি উপযুক্ত VNDK স্প্রেডশিট (যেমন, eligible-list.csv) প্রদান করে যা ফ্রেমওয়ার্ক শেয়ার করা লাইব্রেরি ট্যাগ করে যা ভেন্ডর মডিউল ব্যবহার করতে পারে:

ট্যাগ বর্ণনা
LL-NDK স্থিতিশীল ABI/API সহ শেয়ার করা লাইব্রেরি যা ফ্রেমওয়ার্ক ও ভেন্ডর মডিউল, দুটিই ব্যবহার করতে পারে।
LL-NDK-Private LL-NDK লাইব্রেরির ব্যক্তিগত ডিপেন্ডেন্সি। ভেন্ডর মডিউল সরাসরি এইসব লাইব্রেরি অ্যাক্সেস করতে পারবে না।
VNDK-SP SP-HAL ফ্রেমওয়ার্ক শেয়ার করা লাইব্রেরি সংক্রান্ত নির্ভরতা।
VNDK-SP-Private VNDK-SP নির্ভরতা যা সব ভেন্ডর মডিউলের জন্য সরাসরি অ্যাক্সেসযোগ্য নয়।
VNDK ফ্রেমওয়ার্ক শেয়ার করা লাইব্রেরি যা ভেন্ডর মডিউলের জন্য উপলভ্য (SP-HAL এবং SP-HAL-Dep ব্যতীত)।
VNDK-Private VNDK নির্ভরতা যা সরাসরি সব ভেন্ডর মডিউলের অ্যাক্সেসযোগ্য নয়।
FWK-ONLY ফ্রেমওয়ার্ক-অনলি শেয়ার করা লাইব্রেরি যা ভেন্ডর মডিউল অ্যাক্সেস করতে পারবে না (সরাসরি বা পরোক্ষভাবে, কোনওভাবেই নয়)।
FWK-ONLY-RS শুধুমাত্র ফ্রেমওয়ার্ক-শেয়ার করা লাইব্রেরি যা ভেন্ডর মডিউল (RS ব্যবহার ছাড়া) অ্যাক্সেস করতে পারবে না।

নিম্নলিখিত সারণীতে ভেন্ডর শেয়ার করা লাইব্রেরির জন্য ব্যবহৃত ট্যাগ সম্পর্কে বর্ণনা করা হয়েছে:

ট্যাগ বর্ণনা
SP-HAL একই প্রসেস HAL ইমপ্লিমেন্টেশন শেয়ার করা লাইব্রেরি।
SP-HAL-Dep SP-HAL ভেন্ডর শেয়ার করা লাইব্রেরি ডিপেন্ডেন্সি (এছাড়াও SP-HAL ডিপেন্ডেন্সি বলা হয় LL-NDK ও VNDK-SP ছাড়া)।
VND-ONLY ফ্রেমওয়ার্ক-ইনভিজিবল শেয়ার করা লাইব্রেরি যা ফ্রেমওয়ার্ক মডিউল দ্বারা অ্যাক্সেস করা যাবে না। কপি করা এক্সটেন্ডেড VNDK লাইব্রেরিগুলিকেও VND-ONLY হিসেবে ট্যাগ করা হয়।

ট্যাগের মধ্যে সম্পর্ক:

ট্যাগের মধ্যে সম্পর্ক।

ছবি ১. ট্যাগের মধ্যে সম্পর্ক।

ডিপোজিট

লাইব্রেরি ডিপেন্ডেন্সি ডিবাগ করতে, 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 বিকল্প, দুটিই উল্লেখ করা থাকলে, ব্যবহারকারীর ব্যবহার করা চিহ্ন প্রিন্ট করা হয়।