ভেন্ডর নেটিভ ডেভেলপমেন্ট কিট (VNDK) ওভারভিউ

ভেন্ডর নেটিভ ডেভেলপমেন্ট কিট (VNDK) হলো একগুচ্ছ লাইব্রেরি, যা ভেন্ডর বা প্রোডাক্ট পার্টিশনে থাকা অন্যান্য লাইব্রেরি বা বাইনারিগুলো রানটাইমে dlopen-এর জন্য ব্যবহার করে।

অবচয়

ফ্রেমওয়ার্ক এবং ভেন্ডর কোডের মধ্যে এপিআই (API) প্রদানের জন্য অ্যান্ড্রয়েড ৮.০-তে ভেন্ডর এনডিকে (VNDK) চালু করা হয়েছিল। যদিও ভিএনডিকে বহু বছর ধরে সফলভাবে ব্যবহৃত হয়ে আসছে, এর কিছু অসুবিধা রয়েছে:
  • স্টোরেজ
    • একটিমাত্র VNDK APEX প্যাকেজ সমস্ত VNDK লাইব্রেরি অন্তর্ভুক্ত করে, সেগুলি ডিভাইস থেকে ব্যবহৃত হোক বা না হোক।
    • ভেন্ডর ইমেজের একাধিক সংস্করণ সমর্থন করার জন্য GSI-তে VNDK APEX-এর একাধিক সংস্করণ অন্তর্ভুক্ত থাকে।
  • আপডেটযোগ্যতা
    • প্ল্যাটফর্ম আপডেট থেকে আলাদাভাবে VNDK APEX-গুলো আপডেট করা কঠিন।
    • ভেন্ডর ইমেজগুলো প্রায়শই ওভার দ্য এয়ার (OTA) পদ্ধতিতে আপডেট করা হয়, যার ফলে সিস্টেম ইমেজের মধ্যে VNDK অন্তর্ভুক্ত থাকার সুবিধা কমে যায়।
এই সমস্যাগুলোর ভিত্তিতে, আমরা অ্যান্ড্রয়েড ১৫ থেকে VNDK-কে অপ্রচলিত করার সিদ্ধান্ত নিয়েছি।

VNDK বাতিলের বিস্তারিত বিবরণ

সমস্ত VNDK লাইব্রেরি VNDK APEX-এর মধ্যে প্যাকেজ করা থাকে এবং সিস্টেম (-ext) ইমেজে ইনস্টল করা হয়। VNDK অপ্রচলিত হওয়ার সাথে সাথে, পূর্ববর্তী VNDK লাইব্রেরিগুলি অন্যান্য ভেন্ডর-উপলব্ধ লাইব্রেরির মতোই ভেন্ডর (বা প্রোডাক্ট) ইমেজে ইনস্টল করা হয়। VNDK অপ্রচলিত হওয়ার সাথে সাথে এই বৈশিষ্ট্যগুলিও সরিয়ে ফেলা হয়:
  • অ্যান্ড্রয়েড ১৫ এর জন্য VNDK APEX
  • যদি ভেন্ডর বা প্রোডাক্ট পার্টিশনগুলো অ্যান্ড্রয়েড ১৫-এর জন্য বিল্ড করা হয়, তাহলে টার্গেট VNDK-এর ভার্সন নির্দেশকারী সিস্টেম প্রোপার্টিগুলো সরিয়ে ফেলা হয়:
    • ro.vndk.version
    • ro.product.vndk.version
  • যেহেতু কোনো VNDK নেই, তাই VNDK অপ্টিমাইজেশনগুলো উপলব্ধ হবে না:
    • অ্যান্ড্রয়েড গো ডিভাইসগুলির জন্য TARGET_VNDK_USING_CORE_VARIANT
    • ভেন্ডর APEX-গুলির জন্য use_vndk_as_stable
  • ভেন্ডর স্ন্যাপশট, যা VNDK-এর উপর ব্যাপকভাবে নির্ভরশীল।

অপ্রচলিতকরণ থেকে ব্যতিক্রম

VNDK বাতিল হয়ে গেলেও এই বৈশিষ্ট্যগুলো পরিবর্তিত হবে না:
  • বিদ্যমান ভেন্ডর ইমেজগুলোকে সাপোর্ট করার জন্য VNDK ভার্সন ১৪ বা তার নিম্নতর সংস্করণের VNDK APEX-গুলো প্রয়োজন।
  • LL-NDK, VNDK-এর অংশ নয়।

কেন VNDK?

AOSP শুধুমাত্র ফ্রেমওয়ার্ক আপডেটের সুযোগ দেয়, যার মাধ্যমে সিস্টেম পার্টিশনকে সর্বশেষ ফ্রেমওয়ার্ক সংস্করণে আপগ্রেড করা যায় এবং ভেন্ডর পার্টিশন অপরিবর্তিত থাকে। ভিন্ন ভিন্ন সময়ে তৈরি হওয়া সত্ত্বেও, প্রতিটি পার্টিশনের বাইনারিগুলোকে অবশ্যই একে অপরের সাথে কাজ করতে সক্ষম হতে হবে।

শুধুমাত্র ফ্রেমওয়ার্কের আপডেটগুলিতে নিম্নলিখিত চ্যালেঞ্জগুলি অন্তর্ভুক্ত রয়েছে:

  • ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর মডিউলের মধ্যে নির্ভরশীলতা । অ্যান্ড্রয়েড ৮.০-এর আগে, ভেন্ডর এবং সিস্টেম পার্টিশনের মডিউলগুলো একে অপরের সাথে লিঙ্ক করতে পারত। তবে, ভেন্ডর মডিউল থেকে উদ্ভূত নির্ভরশীলতা ফ্রেমওয়ার্ক মডিউলের উন্নয়নে অনাকাঙ্ক্ষিত সীমাবদ্ধতা তৈরি করেছিল।
  • AOSP লাইব্রেরির এক্সটেনশন । যখন সিস্টেম পার্টিশন একটি স্ট্যান্ডার্ড জেনেরিক সিস্টেম ইমেজ (GSI) দিয়ে প্রতিস্থাপন করা হয়, তখন অ্যান্ড্রয়েডের নিয়ম অনুযায়ী সমস্ত অ্যান্ড্রয়েড ডিভাইসকে CTS পাস করতে হয়। তবে, বিক্রেতারা যখন পারফরম্যান্স বাড়াতে বা তাদের HIDL ইমপ্লিমেন্টেশনে অতিরিক্ত কার্যকারিতা যোগ করতে AOSP লাইব্রেরি প্রসারিত করে, তখন একটি স্ট্যান্ডার্ড GSI দিয়ে সিস্টেম পার্টিশন ফ্ল্যাশ করলে বিক্রেতার HIDL ইমপ্লিমেন্টেশনটি ভেঙে যেতে পারে। এই ধরনের সমস্যা প্রতিরোধের নির্দেশিকার জন্য, VNDK এক্সটেনশন দেখুন।

এই চ্যালেঞ্জগুলো মোকাবেলা করার জন্য অ্যান্ড্রয়েডে বেশ কিছু ফিচার রয়েছে, যেমন VNDK (যা এই অংশে বর্ণনা করা হয়েছে), HIDL , hwbinder, device tree overlay , এবং sepolicy overlay।

VNDK-নির্দিষ্ট শর্তাবলী

VNDK-সম্পর্কিত নথিগুলোতে নিম্নলিখিত পরিভাষা ব্যবহার করা হয়:
  • মডিউল বলতে শেয়ার্ড লাইব্রেরি অথবা এক্সিকিউটেবলকে বোঝায়। মডিউলগুলো বিল্ড-টাইম ডিপেন্ডেন্সি তৈরি করে।
  • প্রসেস হলো এক্সিকিউটেবল ফাইল থেকে সৃষ্ট অপারেটিং সিস্টেমের টাস্ক। প্রসেস রান-টাইম ডিপেন্ডেন্সি তৈরি করে।
  • ফ্রেমওয়ার্ক -যোগ্য পদগুলি system পার্টিশনের সাথে সম্পর্কিত:
    • ফ্রেমওয়ার্ক এক্সিকিউটেবল বলতে /system/bin বা /system/xbin এ থাকা এক্সিকিউটেবল ফাইলগুলোকে বোঝায়।
    • ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি বলতে /system/lib[64] এর অধীনে থাকা শেয়ার্ড লাইব্রেরিগুলিকে বোঝায়।
    • ফ্রেমওয়ার্ক মডিউল বলতে ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি এবং ফ্রেমওয়ার্ক এক্সিকিউটেবল উভয়কেই বোঝায়।
    • ফ্রেমওয়ার্ক প্রসেস হলো ফ্রেমওয়ার্ক এক্সিকিউটেবল থেকে উৎপন্ন প্রসেস, যেমন /system/bin/app_process
  • বিক্রেতা -যোগ্য পদগুলি vendor বিভাজনের সাথে সম্পর্কিত:
    • ভেন্ডর এক্সিকিউটেবল বলতে /vendor/bin এ থাকা এক্সিকিউটেবলগুলোকে বোঝায়।
    • ভেন্ডর শেয়ার্ড লাইব্রেরি বলতে /vendor/lib[64] এর অধীনে থাকা শেয়ার্ড লাইব্রেরিগুলিকে বোঝায়।
    • ভেন্ডর মডিউল বলতে ভেন্ডর এক্সিকিউটেবল এবং ভেন্ডর শেয়ার্ড লাইব্রেরি উভয়কেই বোঝায়।
    • ভেন্ডর প্রসেস হলো ভেন্ডর এক্সিকিউটেবল থেকে উৎপন্ন প্রসেস, যেমন /vendor/bin/android.hardware.camera.provider@2.4-service

VNDK ধারণা

অ্যান্ড্রয়েড ৮.০ এবং এর পরবর্তী সংস্করণগুলোর একটি আদর্শ অবস্থায়, ফ্রেমওয়ার্ক প্রসেসগুলো ভেন্ডর শেয়ার্ড লাইব্রেরি লোড করে না, সমস্ত ভেন্ডর প্রসেস শুধুমাত্র ভেন্ডর শেয়ার্ড লাইব্রেরি (এবং ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরির একটি অংশ) লোড করে, এবং ফ্রেমওয়ার্ক প্রসেস ও ভেন্ডর প্রসেসগুলোর মধ্যকার যোগাযোগ HIDL ও হার্ডওয়্যার বাইন্ডার দ্বারা নিয়ন্ত্রিত হয়।

এই ধরনের পরিস্থিতিতে এই সম্ভাবনাও থাকে যে, ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরির স্থিতিশীল ও পাবলিক এপিআইগুলো ভেন্ডর মডিউল ডেভেলপারদের জন্য যথেষ্ট নাও হতে পারে (যদিও অ্যান্ড্রয়েড রিলিজের মধ্যে এপিআই পরিবর্তিত হতে পারে), যার ফলে ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরির কোনো একটি অংশ ভেন্ডর প্রসেসগুলোর জন্য অ্যাক্সেসযোগ্য হওয়া প্রয়োজন। এছাড়াও, যেহেতু পারফরম্যান্সের প্রয়োজনীয়তার কারণে আপোস করতে হতে পারে, তাই রেসপন্স-টাইমের জন্য অত্যন্ত গুরুত্বপূর্ণ কিছু HAL-কে ভিন্নভাবে বিবেচনা করতে হবে।

নিম্নলিখিত বিভাগগুলিতে বিশদভাবে বর্ণনা করা হয়েছে কিভাবে VNDK ভেন্ডরদের জন্য ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি এবং সেম-প্রসেস এইচএএল (SP-HAL) পরিচালনা করে।

বিক্রেতার জন্য ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি

এই বিভাগে ভেন্ডর প্রসেসের জন্য অ্যাক্সেসযোগ্য শেয়ার্ড লাইব্রেরিগুলোকে শ্রেণীবদ্ধ করার মানদণ্ড বর্ণনা করা হয়েছে। একাধিক অ্যান্ড্রয়েড রিলিজ জুড়ে ভেন্ডর মডিউল সমর্থন করার দুটি পদ্ধতি রয়েছে:

  1. ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরিগুলোর ABI/API স্থিতিশীল করুন । নতুন ফ্রেমওয়ার্ক মডিউল এবং পুরোনো ভেন্ডর মডিউলগুলো মেমরি ফুটপ্রিন্ট ও স্টোরেজ সাইজ কমাতে একই শেয়ার্ড লাইব্রেরি ব্যবহার করতে পারে। একটি স্বতন্ত্র শেয়ার্ড লাইব্রেরি বিভিন্ন ডাবল-লোডিং সমস্যাও এড়াতে পারে। তবে, স্থিতিশীল ABI/API রক্ষণাবেক্ষণের জন্য ডেভেলপমেন্ট খরচ অনেক বেশি এবং প্রতিটি ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি দ্বারা এক্সপোর্ট করা সমস্ত ABI/API স্থিতিশীল করা অবাস্তব।
  2. পুরানো ফ্রেমওয়ার্কের শেয়ার্ড লাইব্রেরি কপি করা । এর সাথে সাইড চ্যানেলের বিরুদ্ধে কঠোর নিষেধাজ্ঞা রয়েছে। সাইড চ্যানেল বলতে ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর মডিউলের মধ্যে যোগাযোগের সমস্ত পদ্ধতিকে বোঝানো হয়, যার মধ্যে রয়েছে (তবে এতেই সীমাবদ্ধ নয়) বাইন্ডার, সকেট, পাইপ, শেয়ার্ড মেমরি, শেয়ার্ড ফাইল এবং সিস্টেম প্রোপার্টি। যোগাযোগ প্রোটোকলটি স্থির এবং স্থিতিশীল না হলে (যেমন hwbinder-এর মাধ্যমে HIDL) কোনো যোগাযোগ করা যাবে না। একই সাথে একাধিক শেয়ার্ড লাইব্রেরি লোড করাও সমস্যার কারণ হতে পারে; উদাহরণস্বরূপ, যদি নতুন লাইব্রেরি দ্বারা তৈরি কোনো অবজেক্ট পুরানো লাইব্রেরির ফাংশনে পাস করা হয়, তাহলে একটি ত্রুটি ঘটতে পারে, কারণ এই লাইব্রেরিগুলো অবজেক্টটিকে ভিন্নভাবে ব্যাখ্যা করতে পারে।

শেয়ার্ড লাইব্রেরিগুলোর বৈশিষ্ট্যের ওপর নির্ভর করে বিভিন্ন পদ্ধতি ব্যবহার করা হয়। ফলস্বরূপ, ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরিগুলোকে তিনটি উপ-শ্রেণিতে ভাগ করা হয়:

  • এলএল-এনডিকে লাইব্রেরিগুলো হলো ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি , যা স্থিতিশীল হিসেবে পরিচিত। এর ডেভেলপাররা এর এপিআই/এবিআই স্থিতিশীলতা বজায় রাখতে প্রতিশ্রুতিবদ্ধ।
    • LL-NDK-তে নিম্নলিখিত লাইব্রেরিগুলো অন্তর্ভুক্ত রয়েছে: libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so , libneuralnetworks.so , libsync.so , libvndksupport.so , এবং libvulkan.so
  • যোগ্য VNDK লাইব্রেরি (VNDK) হলো ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি যা নিরাপদে দুইবার কপি করা যায়। ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর মডিউল তাদের নিজস্ব কপির সাথে লিঙ্ক করতে পারে। একটি ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি তখনই একটি যোগ্য VNDK লাইব্রেরি হতে পারে, যদি এটি নিম্নলিখিত শর্তগুলো পূরণ করে:
    • এটি ফ্রেমওয়ার্কের সাথে কোনো আইপিসি আদান-প্রদান করে না।
    • এটি ART ভার্চুয়াল মেশিনের সাথে সম্পর্কিত নয়।
    • এটি অস্থিতিশীল ফাইল ফরম্যাটযুক্ত ফাইল বা পার্টিশন পড়তে বা লিখতে পারে না।
    • এটির কোনো বিশেষ সফটওয়্যার লাইসেন্স নেই, যার জন্য আইনি পর্যালোচনার প্রয়োজন হয়।
    • এর কোড মালিকের ভেন্ডরের ব্যবহার নিয়ে কোনো আপত্তি নেই।
  • ফ্রেমওয়ার্ক-অনলি লাইব্রেরি (FWK-ONLY) হলো ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরি যা উপরে উল্লিখিত বিভাগগুলির অন্তর্ভুক্ত নয়। এই লাইব্রেরিগুলি:
    • এগুলোকে ফ্রেমওয়ার্কের অভ্যন্তরীণ বাস্তবায়নের বিবরণ হিসেবে বিবেচনা করা হয়।
    • ভেন্ডর মডিউল দ্বারা এটি অ্যাক্সেস করা যাবে না।
    • এগুলোর ABI/API অস্থিতিশীল এবং API/ABI সামঞ্জস্যের কোনো নিশ্চয়তা নেই।
    • অনুলিপি করা হয়নি।

একই-প্রক্রিয়া HAL (SP-HAL)

সেম-প্রসেস এইচএএল ( SP-HAL ) হলো পূর্বনির্ধারিত কিছু এইচএএল-এর একটি সেট, যা ভেন্ডর শেয়ার্ড লাইব্রেরি হিসেবে বাস্তবায়িত হয় এবং ফ্রেমওয়ার্ক প্রসেস- এ লোড করা হয়। SP-HAL-গুলো একটি লিঙ্কার নেমস্পেস দ্বারা বিচ্ছিন্ন থাকে (যা শেয়ার্ড লাইব্রেরিগুলোর কাছে দৃশ্যমান লাইব্রেরি এবং সিম্বলগুলোকে নিয়ন্ত্রণ করে)। SP-HAL-গুলোকে অবশ্যই শুধুমাত্র LL-NDK এবং VNDK-SP- এর উপর নির্ভরশীল হতে হবে।

VNDK-SP হলো যোগ্য VNDK লাইব্রেরিগুলোর একটি পূর্বনির্ধারিত উপসেট। ফ্রেমওয়ার্ক প্রসেসগুলোতে VNDK-SP লাইব্রেরিগুলো দ্বৈতভাবে লোড করার ফলে কোনো সমস্যা সৃষ্টি না হয়, তা নিশ্চিত করার জন্য এগুলো সতর্কতার সাথে পর্যালোচনা করা হয়। SP-HAL এবং VNDK-SP উভয়ই গুগল দ্বারা সংজ্ঞায়িত।

নিম্নলিখিত গ্রন্থাগারগুলি অনুমোদিত SP-HAL:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP লাইব্রেরিগুলো তাদের Android.bp ফাইলে vndk: { support_system_process: true } উল্লেখ করে। যদি এর সাথে vndk: {private:true} ও উল্লেখ করা হয়, তাহলে এই লাইব্রেরিগুলোকে VNDK-SP-Private বলা হয় এবং এগুলো SP-HALS-এর কাছে অদৃশ্য থাকে।

নিম্নলিখিতগুলি হল RS ব্যতিক্রম সহ ফ্রেমওয়ার্ক-ভিত্তিক লাইব্রেরি (FWK-ONLY-RS) :

  • libft2.so (রেন্ডারস্ক্রিপ্ট)
  • libmediandk.so (রেন্ডারস্ক্রিপ্ট)

VNDK সংস্করণ

VNDK শেয়ার্ড লাইব্রেরিগুলোর ভার্সন রয়েছে:

  • ro.vndk.version সিস্টেম প্রপার্টিটি স্বয়ংক্রিয়ভাবে /vendor/default.prop এ যুক্ত হয়ে যায়।
  • VNDK এবং VNDK-SP শেয়ার্ড লাইব্রেরিগুলো com.android.vndk.v${ro.vndk.version} নামের একটি VNDK এপেক্স হিসেবে ইনস্টল করা হয় এবং /apex/com.android.vndk.v${ro.vndk.version} -এ মাউন্ট করা হয়।

ro.vndk.version এর মান নিচের অ্যালগরিদম দ্বারা নির্বাচন করা হয়:

  • যদি BOARD_VNDK_VERSION current সমান না হয়, তাহলে BOARD_VNDK_VERSION ব্যবহার করুন।
  • যদি BOARD_VNDK_VERSION current সমান হয়:
    • যদি PLATFORM_VERSION_CODENAME REL হয়, তাহলে PLATFORM_SDK_VERSION (যেমন 28 ) ব্যবহার করুন।
    • অন্যথায়, PLATFORM_VERSION_CODENAME (যেমন P ) ব্যবহার করুন।

ভেন্ডর টেস্ট স্যুট (VTS)

অ্যান্ড্রয়েড ভেন্ডর টেস্ট স্যুট (VTS) অনুযায়ী ro.vndk.version প্রপার্টিটি খালি না থাকা বাধ্যতামূলক। নতুন চালু হওয়া ডিভাইস এবং আপগ্রেড হওয়া ডিভাইস উভয়কেই ro.vndk.version নির্ধারণ করতে হবে। কিছু VNDK টেস্ট কেস (যেমন VtsVndkFilesTest এবং VtsVndkDependencyTest ) উপযুক্ত VNDK লাইব্রেরির ডেটা সেট লোড করার জন্য ro.vndk.version প্রপার্টির উপর নির্ভর করে।