Vendor Native Development Kit (VNDK) ওভারভিউ

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

ডেপ্রিকেশন

ফ্রেমওয়ার্ক ও ভেন্ডর কোডের মধ্যে API প্রদান করতে Android 8.0-তে ভেন্ডর NDK চালু করা হয়েছে। VNDK বহু বছর ধরে সফলভাবে ব্যবহার করা হলেও, এতে কিছু অসুবিধা আছে:
  • স্টোরেজ
    • একটি VNDK APEX প্যাকেজ সব VNDK লাইব্রেরি প্যাকেজ করে, সেগুলি ডিভাইস থেকে ব্যবহার করা হোক বা না হোক।
    • ভেন্ডর ইমেজের একাধিক ভার্সন সাপোর্ট করার জন্য GSI-তে VNDK APEX-এর একাধিক ভার্সন থাকে।
  • আপডেট করা যাবে
    • প্ল্যাটফর্ম আপডেট থেকে আলাদাভাবে VNDK APEX আপডেট করা কঠিন।
    • ভেন্ডর ইমেজ প্রায়ই ওভার-দ্য-এয়ার (OTA) আপডেট করা হয়, যার ফলে সিস্টেম ইমেজের মধ্যে VNDK প্যাকেজ থাকার সুবিধা কমে যায়।
এইসব সমস্যার ভিত্তিতে, আমরা Android 15 থেকে VNDK বাতিল করার সিদ্ধান্ত নিয়েছি।

VNDK বন্ধ করা সংক্রান্ত বিবরণ

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

বন্ধ করা থেকে ব্যতিক্রম

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

VNDK কেন?

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

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

  • ফ্রেমওয়ার্ক মডিউল ও ভেন্ডর মডিউলের মধ্যে পারস্পরিক নির্ভরতা। Android 8.0-এর আগে, ভেন্ডর ও সিস্টেম পার্টিশনের মডিউল একে অপরের সাথে লিঙ্ক করতে পারত। তবে, ভেন্ডর মডিউল থেকে আসা ডিপেন্ডেন্সি ফ্রেমওয়ার্ক মডিউল ডেভেলপমেন্টের উপর অবাঞ্ছিত বিধিনিষেধ আরোপ করে।
  • AOSP লাইব্রেরির এক্সটেনশন। Android সিস্টেম পার্টিশনকে স্ট্যান্ডার্ড জেনেরিক সিস্টেম ইমেজ (GSI) দিয়ে পরিবর্তন করা হলে সব Android ডিভাইসকে CTS পাস করতে হবে। তবে, ভেন্ডররা পারফর্ম্যান্স বুস্ট করতে বা তাদের HIDL ইমপ্লিমেন্টেশনের জন্য অতিরিক্ত কার্যকারিতা যোগ করতে AOSP লাইব্রেরি বাড়ায়, তাই স্ট্যান্ডার্ড GSI-এর সাথে সিস্টেম পার্টিশন ফ্ল্যাশ করলে ভেন্ডরের HIDL ইমপ্লিমেন্টেশন ভেঙে যেতে পারে। এই ধরনের ব্রেकेज প্রতিরোধ করার নির্দেশিকা পেতে, VNDK এক্সটেনশন দেখুন।

এইসব চ্যালেঞ্জের সমাধান করতে, Android-এ VNDK (এই বিভাগে বর্ণিত), HIDL, hwbinder, ডিভাইস ট্রি ওভারলে এবং sepolicy ওভারলের মতো বিভিন্ন ফিচার আছে।

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 কনসেপ্ট

Android 8.0 এবং তার পরবর্তী ভার্সনের ক্ষেত্রে, ফ্রেমওয়ার্ক প্রসেস ভেন্ডরের শেয়ার করা লাইব্রেরি লোড করে না, সব ভেন্ডর প্রসেস শুধুমাত্র ভেন্ডরের শেয়ার করা লাইব্রেরি লোড করে (এবং ফ্রেমওয়ার্কের শেয়ার করা লাইব্রেরির একটি অংশ) এবং ফ্রেমওয়ার্ক প্রসেস ও ভেন্ডর প্রসেসের মধ্যে যোগাযোগ HIDL এবং হার্ডওয়্যার বাইন্ডার দ্বারা পরিচালিত হয়।

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

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

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

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

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

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

  • LL-NDK লাইব্রেরি হল ফ্রেমওয়ার্ক শেয়ার করা লাইব্রেরি যেগুলি স্থিতিশীল বলে পরিচিত। তাদের ডেভেলপাররা API/ABI স্টেবিলিটি বজায় রাখতে বদ্ধপরিকর।
    • 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 লাইব্রেরি হতে পারে যদি সেটি নিম্নলিখিত মানদণ্ড পূরণ করে:
    • এটি ফ্রেমওয়ার্কে IPC পাঠায়/পায় না।
    • এটি ART ভার্চুয়াল মেশিনের সাথে সম্পর্কিত নয়।
    • এটি অস্থির ফাইল ফর্ম্যাট সহ ফাইল/পার্টিশন রিড/রাইট করে না।
    • এটির কোনও বিশেষ সফ্টওয়্যার লাইসেন্স নেই যার জন্য আইনি পর্যালোচনা প্রয়োজন।
    • এর কোডের মালিকের, ভেন্ডর ব্যবহারের ব্যাপারে কোনও আপত্তি নেই।
  • শুধুমাত্র ফ্রেমওয়ার্ক লাইব্রেরি (FWK-ONLY) হল ফ্রেমওয়ার্ক শেয়ার করা লাইব্রেরি যা উপরে উল্লেখ করা বিভাগের মধ্যে পড়ে না। এইসব লাইব্রেরি:
    • ফ্রেমওয়ার্কের ইন্টার্নাল প্রয়োগ সংক্রান্ত বিবরণ হিসেবে বিবেচিত হয়।
    • ভেন্ডর মডিউল দ্বারা অ্যাক্সেস করা যাবে না।
    • অস্থিতিশীল ABI/API আছে এবং API/ABI কম্প্যাটিবিলিটি গ্যারান্টি নেই।
    • কপি করা হয় না।

সেম-প্রসেস HAL (SP-HAL)

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

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

নিম্নলিখিত লাইব্রেরিগুলি অনুমোদিত 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 (Renderscript)
  • libmediandk.so (Renderscript)

VNDK ভার্সনিং

VNDK শেয়ার করা লাইব্রেরির ভার্সন করা হয়েছে:

  • ro.vndk.version সিস্টেম প্রপার্টি অটোমেটিক /vendor/default.prop-এ যোগ করা হয়।
  • VNDK এবং VNDK-SP শেয়ার করা লাইব্রেরি VNDK অ্যাপেক্স হিসেবে ইনস্টল করা হয় com.android.vndk.v${ro.vndk.version} এবং /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)

Android ভেন্ডর টেস্ট স্যুট (VTS) একটি ফাঁকা না থাকা ro.vndk.version প্রপার্টি বাধ্যতামূলক করে। নতুন লঞ্চ করা ডিভাইস এবং আপগ্রেড করা ডিভাইস, দু'টিকেই ro.vndk.version সংজ্ঞায়িত করতে হবে। কিছু VNDK টেস্ট কেস (যেমন, VtsVndkFilesTest এবং VtsVndkDependencyTest) ro.vndk.version প্রপার্টির উপর নির্ভর করে যাতে ম্যাচিং উপযুক্ত VNDK লাইব্রেরি ডেটা সেট লোড করা যায়।