VNDK সংজ্ঞা টুল

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

এই বিভাগে VNDK ডেফিনিশন টুলের তিনটি বহুল ব্যবহৃত কমান্ড আলোচনা করা হয়েছে:

  • অ্যান্ড্রয়েড ৮.০ এবং তার পরবর্তী সংস্করণগুলিতে বিল্ড সিস্টেমের একটি সমাধান হিসেবে vndk . 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 সাবকমান্ডের বিকল্পগুলির মধ্যে রয়েছে:

বিকল্প বর্ণনা
--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 এ ইনস্টল করতে হবে
অতিরিক্ত_ভেন্ডর_লাইব্রেরি অবশ্যই /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 অবশ্যই একটি উপযুক্ত লাইব্রেরি ট্যাগ ফাইল (নীচে বর্ণিত) উল্লেখ করতে হবে, যেটি হলো গুগল-প্রদত্ত একটি স্প্রেডশিট এবং এতে ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরির বিভিন্ন ক্যাটাগরি বর্ণনা করা আছে।
--module-info এটি অ্যান্ড্রয়েড বিল্ড সিস্টেম দ্বারা তৈরি module-info.json ফাইলটিকে নির্দেশ করে। এটি VNDK ডেফিনিশন টুলকে বাইনারি মডিউলগুলোকে সোর্স কোডের সাথে সংযুক্ত করতে সাহায্য করে।

যোগ্য লাইব্রেরি ট্যাগ ফাইল

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

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

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

ট্যাগ বর্ণনা
এসপি-এইচএএল একই-প্রক্রিয়া HAL বাস্তবায়নের শেয়ার্ড লাইব্রেরি।
এসপি-এইচএএল-ডিপ SP-HAL ভেন্ডর শেয়ার্ড লাইব্রেরির নির্ভরতা (এগুলোকে SP-HAL নির্ভরতাও বলা হয়, তবে LL-NDK এবং VNDK-SP বাদে)।
শুধুমাত্র VND ফ্রেমওয়ার্ক-অদৃশ্য শেয়ার্ড লাইব্রেরি, যা ফ্রেমওয়ার্ক মডিউল দ্বারা অ্যাক্সেস করা উচিত নয়। কপি করা বর্ধিত 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
        

এই আউটপুট থেকে দেখা যায় যে, libdl.so দ্বারা ld-android.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 অপশন উভয়ই নির্দিষ্ট করা হয়, তবে ব্যবহারকারীর ব্যবহৃত সিম্বলগুলো প্রিন্ট করা হয়।