VNDK সংজ্ঞা টুল

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

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

  • vndk অ্যান্ড্রয়েড 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] এ কপি করা আবশ্যক লাইব্রেরিগুলি নির্ধারণ করতে মডিউল নির্ভরতা সমাধান করে। /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 এ ইনস্টল করতে হবে
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 সাবকমান্ড বিক্রেতা মডিউল স্ক্যান করে এবং তাদের নির্ভরতা পরীক্ষা করে। যদি এটি লঙ্ঘন সনাক্ত করে, এটি লঙ্ঘন নির্ভর লাইব্রেরি এবং প্রতীক ব্যবহারগুলি মুদ্রণ করে:

./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 অ্যান্ড্রয়েড বিল্ড সিস্টেম দ্বারা উত্পন্ন module-info.json দিকে পয়েন্ট করে৷ এটি VNDK সংজ্ঞা টুলকে সোর্স কোডের সাথে বাইনারি মডিউল সংযুক্ত করতে সাহায্য করে।

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

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

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

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

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

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

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

চিত্র 1. ট্যাগের মধ্যে সম্পর্ক।

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