VNDK বিল্ড সিস্টেম সমর্থন

অ্যান্ড্রয়েড ৮.১ এবং এর পরবর্তী সংস্করণগুলোতে বিল্ড সিস্টেমে বিল্ট-ইন VNDK সাপোর্ট রয়েছে। যখন VNDK সাপোর্ট সক্রিয় করা হয়, তখন বিল্ড সিস্টেম মডিউলগুলোর মধ্যেকার নির্ভরতা পরীক্ষা করে, ভেন্ডর মডিউলগুলোর জন্য একটি ভেন্ডর-নির্দিষ্ট ভ্যারিয়েন্ট তৈরি করে এবং স্বয়ংক্রিয়ভাবে সেই মডিউলগুলোকে নির্দিষ্ট ডিরেক্টরিতে ইনস্টল করে।

VNDK বিল্ড সাপোর্ট উদাহরণ

এই উদাহরণে, Android.bp মডিউল সংজ্ঞায় libexample নামের একটি লাইব্রেরি সংজ্ঞায়িত করা হয়েছে। vendor_available প্রপার্টিটি নির্দেশ করে যে ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর মডিউলগুলো libexample উপর নির্ভর করতে পারে:

libexample vendor_available:true এবং vndk.enabled:true

চিত্র ১. সমর্থন সক্রিয় করা হয়েছে।

ফ্রেমওয়ার্ক এক্সিকিউটেবল /system/bin/foo এবং ভেন্ডর এক্সিকিউটেবল /vendor/bin/bar উভয়ই libexample উপর নির্ভরশীল এবং তাদের shared_libs প্রপার্টিতে libexample অন্তর্ভুক্ত রয়েছে।

যদি ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর মডিউল উভয়ই libexample ব্যবহার করে, তবে libexample এর দুটি ভ্যারিয়েন্ট বিল্ড করা হয়। কোর ভ্যারিয়েন্টটি ( libexample এর নামে) ফ্রেমওয়ার্ক মডিউলগুলো ব্যবহার করে এবং ভেন্ডর ভ্যারিয়েন্টটি ( libexample.vendor এর নামে) ভেন্ডর মডিউলগুলো ব্যবহার করে। এই দুটি ভ্যারিয়েন্ট ভিন্ন ভিন্ন ডিরেক্টরিতে ইনস্টল করা হয়:

  • মূল সংস্করণটি /system/lib[64]/libexample.so তে ইনস্টল করা আছে।
  • ভেন্ডর ভ্যারিয়েন্টটি VNDK APEX-এ ইনস্টল করা হয়, কারণ vndk.enabled এর মান true

আরও বিস্তারিত তথ্যের জন্য, মডিউল সংজ্ঞা দেখুন।

বিল্ড সমর্থন কনফিগার করুন

কোনো প্রোডাক্ট ডিভাইসের জন্য সম্পূর্ণ বিল্ড সিস্টেম সাপোর্ট সক্রিয় করতে, BoardConfig.mkBOARD_VNDK_VERSION যোগ করুন:

BOARD_VNDK_VERSION := current

এই সেটিংটির একটি বৈশ্বিক প্রভাব রয়েছে: BoardConfig.mk এ সংজ্ঞায়িত করা হলে, সমস্ত মডিউল চেক করা হয়। যেহেতু কোনো ত্রুটিপূর্ণ মডিউলকে ব্ল্যাকলিস্ট বা হোয়াইটলিস্ট করার কোনো ব্যবস্থা নেই, তাই BOARD_VNDK_VERSION যোগ করার আগে আপনার সমস্ত অপ্রয়োজনীয় ডিপেন্ডেন্সি পরিষ্কার করে নেওয়া উচিত। আপনি আপনার এনভায়রনমেন্ট ভেরিয়েবলে BOARD_VNDK_VERSION সেট করে একটি মডিউল পরীক্ষা এবং কম্পাইল করতে পারেন:

$ BOARD_VNDK_VERSION=current m module_name.vendor

যখন BOARD_VNDK_VERSION সক্রিয় করা হয়, তখন বেশ কিছু ডিফল্ট গ্লোবাল হেডার সার্চ পাথ মুছে ফেলা হয়। এগুলোর মধ্যে রয়েছে:

  • frameworks/av/include
  • frameworks/native/include
  • frameworks/native/opengl/include
  • hardware/libhardware/include
  • hardware/libhardware_legacy/include
  • hardware/ril/include
  • libnativehelper/include
  • libnativehelper/include_deprecated
  • system/core/include
  • system/media/audio/include

যদি কোনো মডিউল এই ডিরেক্টরিগুলোর হেডার ফাইলের উপর নির্ভর করে, তাহলে আপনাকে অবশ্যই header_libs , static_libs , এবং/অথবা shared_libs ব্যবহার করে নির্ভরতাগুলো (সুস্পষ্টভাবে) উল্লেখ করতে হবে।

VNDK APEX

Android 10 এবং তার নিচের সংস্করণগুলিতে, vndk.enabled সহ মডিউলগুলি /system/lib[64]/vndk[-sp]-${VER} -এ ইনস্টল করা হয়েছিল। Android 11 এবং তার উপরের সংস্করণগুলিতে, VNDK লাইব্রেরিগুলি একটি APEX ফরম্যাটে প্যাকেজ করা হয় এবং VNDK APEX-এর নাম হল com.android.vndk.v${VER} । ডিভাইসের কনফিগারেশনের উপর নির্ভর করে, VNDK APEX ফ্ল্যাটেনড বা আনফ্ল্যাটেনড হয় এবং ক্যানোনিকাল পাথ /apex/com.android.vndk.v${VER} থেকে পাওয়া যায়।

VNDK APEX

চিত্র ২. ভিএনডিকে এপেক্স।

মডিউল সংজ্ঞা

BOARD_VNDK_VERSION ব্যবহার করে অ্যান্ড্রয়েড বিল্ড করতে হলে, আপনাকে অবশ্যই Android.mk অথবা Android.bp যেকোনো একটিতে মডিউল ডেফিনিশন সংশোধন করতে হবে। এই অংশে বিভিন্ন ধরনের মডিউল ডেফিনিশন, VNDK-সম্পর্কিত কয়েকটি মডিউল প্রপার্টি এবং বিল্ড সিস্টেমে প্রয়োগ করা ডিপেন্ডেন্সি চেক সম্পর্কে বর্ণনা করা হয়েছে।

বিক্রেতা মডিউল

ভেন্ডর মডিউল হলো ভেন্ডর-নির্দিষ্ট এক্সিকিউটেবল বা শেয়ার্ড লাইব্রেরি যা অবশ্যই একটি ভেন্ডর পার্টিশনে ইনস্টল করতে হবে। Android.bp ফাইলগুলিতে, ভেন্ডর মডিউলের জন্য অবশ্যই vendor বা proprietary প্রপার্টির মান true সেট করতে হবে। Android.mk ফাইলগুলিতে, ভেন্ডর মডিউলের জন্য অবশ্যই LOCAL_VENDOR_MODULE বা LOCAL_PROPRIETARY_MODULE মান true সেট করতে হবে।

যদি BOARD_VNDK_VERSION সংজ্ঞায়িত থাকে, তাহলে বিল্ড সিস্টেম ভেন্ডর মডিউল এবং ফ্রেমওয়ার্ক মডিউলের মধ্যে নির্ভরতা অনুমোদন করে না এবং নিম্নলিখিত ক্ষেত্রে ত্রুটি দেখায়:

  • vendor:true ছাড়া একটি মডিউল, vendor:true সহ একটি মডিউলের উপর নির্ভর করে, অথবা
  • vendor:true থাকা একটি মডিউল এমন একটি নন- llndk_library মডিউলের উপর নির্ভর করে, যেটির vendor:true বা vendor_available:true কোনোটিই নেই।

এই নির্ভরতা যাচাইটি Android.bp এর header_libs , static_libsshared_libs ক্ষেত্রে এবং Android.mk এর LOCAL_HEADER_LIBRARIES , LOCAL_STATIC_LIBRARIESLOCAL_SHARED_LIBRARIES এর ক্ষেত্রে প্রযোজ্য।

এলএল-এনডিকে

LL-NDK শেয়ার্ড লাইব্রেরিগুলো হলো স্থিতিশীল ABI-যুক্ত শেয়ার্ড লাইব্রেরি। ফ্রেমওয়ার্ক এবং ভেন্ডর মডিউল উভয়ই একই এবং সর্বশেষ ইমপ্লিমেন্টেশন ব্যবহার করে। প্রতিটি LL-NDK শেয়ার্ড লাইব্রেরির জন্য, cc_library একটি llndk প্রপার্টি থাকে, যার মধ্যে একটি সিম্বল ফাইল অন্তর্ভুক্ত থাকে:

cc_library {
    name: "libvndksupport",
    llndk: {
        symbol_file: "libvndksupport.map.txt",
    },
}

সিম্বল ফাইলটি ভেন্ডর মডিউলগুলোর কাছে দৃশ্যমান সিম্বলগুলো বর্ণনা করে। উদাহরণস্বরূপ:

LIBVNDKSUPPORT {
  global:
    android_load_sphal_library; # llndk
    android_unload_sphal_library; # llndk
  local:
    *;
};

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

  • _PRIVATE বা _PLATFORM দিয়ে শেষ হওয়া বিভাগে সংজ্ঞায়িত নয়,
  • #platform-only ট্যাগ নেই, এবং
  • #introduce* ট্যাগ নেই অথবা ট্যাগটি টার্গেটের সাথে মিলে যায়।

ভিএনডিকে

Android.bp ফাইলগুলিতে, cc_library , cc_library_static , cc_library_shared , এবং cc_library_headers মডিউল ডেফিনিশনগুলি তিনটি VNDK-সম্পর্কিত প্রপার্টি সাপোর্ট করে: vendor_available , vndk.enabled , এবং vndk.support_system_process

যদি vendor_available বা vndk.enabled true হয়, তাহলে দুটি ভ্যারিয়েন্ট ( core এবং vendor ) বিল্ড করা হতে পারে। core ভ্যারিয়েন্টটিকে একটি ফ্রেমওয়ার্ক মডিউল এবং vendor ভ্যারিয়েন্টটিকে একটি ভেন্ডর মডিউল হিসেবে বিবেচনা করা উচিত। যদি কিছু ফ্রেমওয়ার্ক মডিউল এই মডিউলটির উপর নির্ভরশীল হয়, তাহলে core ভ্যারিয়েন্টটি বিল্ড করা হয়। যদি কিছু ভেন্ডর মডিউল এই মডিউলটির উপর নির্ভরশীল হয়, তাহলে vendor ভ্যারিয়েন্টটি বিল্ড করা হয়। বিল্ড সিস্টেম নিম্নলিখিত ডিপেন্ডেন্সি চেকগুলো প্রয়োগ করে:

  • কোর ভ্যারিয়েন্টটি সর্বদা শুধুমাত্র ফ্রেমওয়ার্কের জন্য উপলব্ধ এবং ভেন্ডর মডিউলগুলোর জন্য অ্যাক্সেসযোগ্য নয়।
  • ভেন্ডর ভ্যারিয়েন্টটি ফ্রেমওয়ার্ক মডিউলগুলোর জন্য সর্বদা অপ্রাপ্য থাকে।
  • ভেন্ডর ভ্যারিয়েন্টের সমস্ত ডিপেন্ডেন্সি, যা header_libs , static_libs , এবং/অথবা shared_libs এ নির্দিষ্ট করা আছে, সেগুলোকে অবশ্যই একটি llndk_library অথবা vendor_available বা vndk.enabled সহ একটি মডিউল হতে হবে।
  • যদি vendor_available true হয়, তাহলে ভেন্ডর ভ্যারিয়েন্টটি সকল ভেন্ডর মডিউলের কাছে অ্যাক্সেসযোগ্য হবে।
  • যদি vendor_available false হয়, তাহলে ভেন্ডর ভ্যারিয়েন্টটি শুধুমাত্র অন্যান্য VNDK বা VNDK-SP মডিউলগুলোর কাছেই অ্যাক্সেসযোগ্য হবে (অর্থাৎ, vendor:true থাকা মডিউলগুলো vendor_available:false মডিউলগুলোকে লিঙ্ক করতে পারবে না)।

cc_library বা cc_library_shared এর ডিফল্ট ইনস্টলেশন পাথ নিম্নলিখিত নিয়ম দ্বারা নির্ধারিত হয়:

  • মূল সংস্করণটি /system/lib[64] এ ইনস্টল করা হয়।
  • বিক্রেতা ভেদে ইনস্টলেশনের পথ ভিন্ন হতে পারে:
    • যদি vndk.enabled false হয়, তাহলে ভেন্ডর ভেরিয়েন্টটি /vendor/lib[64] এ ইনস্টল করা হয়।
    • যদি vndk.enabled true হয়, তাহলে ভেন্ডর ভ্যারিয়েন্টটি VNDK APEX-এ ( com.android.vndk.v${VER} ) ইনস্টল করা হয়।

নিচের সারণিতে সংক্ষেপে তুলে ধরা হলো যে বিল্ড সিস্টেম কীভাবে ভেন্ডর ভ্যারিয়েন্টগুলো পরিচালনা করে:

বিক্রেতা উপলব্ধ vndk
সক্ষম
vndk
সমর্থন_সিস্টেম_প্রক্রিয়া
বিক্রেতার বিভিন্ন বিবরণ
true false false ভেন্ডর ভেরিয়েন্টগুলি VND-ONLY । শেয়ার্ড লাইব্রেরিগুলি /vendor/lib[64] এ ইনস্টল করা হয়।
true অবৈধ (বিল্ড ত্রুটি)
true false ভেন্ডর ভ্যারিয়েন্টটি হলো VNDK । শেয়ার্ড লাইব্রেরিগুলো VNDK APEX-এ ইনস্টল করা হয়।
true ভেন্ডর ভ্যারিয়েন্টটি হলো VNDK-SP । শেয়ার্ড লাইব্রেরিগুলো VNDK APEX-এ ইনস্টল করা হয়।

false

false

false

কোনো বিক্রেতা সংস্করণ নেই। এই মডিউলটি শুধুমাত্র FWK-এর জন্য

true অবৈধ (বিল্ড ত্রুটি)
true false ভেন্ডর ভ্যারিয়েন্টগুলো হলো VNDK-Private । শেয়ার্ড লাইব্রেরিগুলো VNDK APEX-এ ইনস্টল করা হয়। ভেন্ডর মডিউলগুলো দ্বারা এগুলো সরাসরি ব্যবহার করা যাবে না।
true ভেন্ডর ভ্যারিয়েন্টগুলো হলো VNDK-SP-Private । শেয়ার্ড লাইব্রেরিগুলো VNDK APEX-এ ইনস্টল করা হয়। ভেন্ডর মডিউলগুলো দ্বারা এগুলো সরাসরি ব্যবহার করা যাবে না।

VNDK এক্সটেনশন

VNDK এক্সটেনশনগুলি হল অতিরিক্ত API সহ VNDK শেয়ার্ড লাইব্রেরি। এক্সটেনশনগুলি /vendor/lib[64]/vndk[-sp] (সংস্করণ প্রত্যয় ছাড়া) এ ইনস্টল করা হয় এবং রানটাইমে মূল VNDK শেয়ার্ড লাইব্রেরিগুলিকে ওভাররাইড করে।

VNDK এক্সটেনশনগুলি সংজ্ঞায়িত করুন

অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলোতে, Android.bp স্বাভাবিকভাবেই VNDK এক্সটেনশন সমর্থন করে। একটি VNDK এক্সটেনশন বিল্ড করতে, vendor:true এবং একটি extends প্রপার্টি সহ আরেকটি মডিউল সংজ্ঞায়িত করুন:

cc_library {
    name: "libvndk",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libvndk_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk",
    },
}

যে মডিউলে vendor:true , vndk.enabled:true , এবং extends প্রোপার্টিগুলো থাকে, সেটি VNDK এক্সটেনশনকে সংজ্ঞায়িত করে:

  • extends প্রপার্টিতে অবশ্যই একটি বেস VNDK শেয়ার্ড লাইব্রেরির নাম (অথবা VNDK-SP শেয়ার্ড লাইব্রেরির নাম) উল্লেখ করতে হবে।
  • VNDK এক্সটেনশন (বা VNDK-SP এক্সটেনশন)-গুলোর নামকরণ করা হয় সেই মূল মডিউলের নামানুসারে, যেখান থেকে এগুলো প্রসারিত হয়। উদাহরণস্বরূপ, libvndk_ext এর আউটপুট বাইনারি হলো libvndk.so , libvndk_ext.so নয়।
  • VNDK এক্সটেনশনগুলি /vendor/lib[64]/vndk তে ইনস্টল করা হয়।
  • VNDK-SP এক্সটেনশনগুলি /vendor/lib[64]/vndk-sp তে ইনস্টল করা হয়।
  • বেস শেয়ার্ড লাইব্রেরিগুলিতে অবশ্যই vndk.enabled:true এবং vendor_available:true উভয়ই থাকতে হবে।

একটি VNDK-SP এক্সটেনশনকে অবশ্যই একটি VNDK-SP শেয়ার্ড লাইব্রেরি থেকে এক্সটেন্ড করতে হবে ( vndk.support_system_process অবশ্যই সমান হতে হবে):

cc_library {
    name: "libvndk_sp",
    vendor_available: true,
    vndk: {
        enabled: true,
        support_system_process: true,
    },
}

cc_library {
    name: "libvndk_sp_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk_sp",
        support_system_process: true,
    },
}

VNDK এক্সটেনশন (বা VNDK-SP এক্সটেনশন) অন্যান্য ভেন্ডরের শেয়ার্ড লাইব্রেরির উপর নির্ভর করতে পারে:

cc_library {
    name: "libvndk",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libvndk_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk",
    },
    shared_libs: [
        "libvendor",
    ],
}

cc_library {
    name: "libvendor",
    vendor: true,
}

VNDK এক্সটেনশন ব্যবহার করুন

যদি কোনো ভেন্ডর মডিউল VNDK এক্সটেনশন দ্বারা সংজ্ঞায়িত অতিরিক্ত API-এর উপর নির্ভর করে, তাহলে মডিউলটিকে তার shared_libs প্রপার্টিতে VNDK এক্সটেনশনটির নাম উল্লেখ করতে হবে:

// A vendor shared library example
cc_library {
    name: "libvendor",
    vendor: true,
    shared_libs: [
        "libvndk_ext",
    ],
}

// A vendor executable example
cc_binary {
    name: "vendor-example",
    vendor: true,
    shared_libs: [
        "libvndk_ext",
    ],
}

যদি কোনো ভেন্ডর মডিউল VNDK এক্সটেনশনের উপর নির্ভর করে, তাহলে সেই VNDK এক্সটেনশনগুলি স্বয়ংক্রিয়ভাবে /vendor/lib[64]/vndk[-sp] এ ইনস্টল করা হয়। যদি কোনো মডিউল আর কোনো VNDK এক্সটেনশনের উপর নির্ভর না করে, তাহলে শেয়ার্ড লাইব্রেরিটি সরানোর জন্য CleanSpec.mk এ একটি ক্লিন স্টেপ যোগ করুন। উদাহরণস্বরূপ:

$(call add-clean-step, rm -rf $(TARGET_OUT_VENDOR)/lib/libvndk.so)

শর্তসাপেক্ষ সংকলন

এই বিভাগে নিম্নলিখিত তিনটি VNDK শেয়ার্ড লাইব্রেরির মধ্যেকার সূক্ষ্ম পার্থক্যগুলো (যেমন, কোনো একটি ভ্যারিয়েন্ট থেকে কোনো ফিচার যোগ করা বা বাদ দেওয়া) কীভাবে সামলাতে হয়, তা বর্ণনা করা হয়েছে:

  • কোর সংস্করণ (যেমন /system/lib[64]/libexample.so )
  • ভেন্ডর ভেরিয়েন্ট (যেমন /apex/com.android.vndk.v${VER}/lib[64]/libexample.so )
  • VNDK এক্সটেনশন (যেমন /vendor/lib[64]/vndk[-sp]/libexample.so )

শর্তসাপেক্ষ কম্পাইলার ফ্ল্যাগ

অ্যান্ড্রয়েড বিল্ড সিস্টেম ডিফল্টরূপে ভেন্ডর ভ্যারিয়েন্ট এবং VNDK এক্সটেনশনগুলির জন্য __ANDROID_VNDK__ সংজ্ঞায়িত করে। আপনি C প্রিপ্রসেসর গার্ড ব্যবহার করে কোডটিকে সুরক্ষিত করতে পারেন:

void all() { }

#if !defined(__ANDROID_VNDK__)
void framework_only() { }
#endif

#if defined(__ANDROID_VNDK__)
void vndk_only() { }
#endif

__ANDROID_VNDK__ ছাড়াও Android.bp তে বিভিন্ন cflags বা cppflags নির্দিষ্ট করা যেতে পারে। target.vendor এ নির্দিষ্ট করা cflags বা cppflags ভেন্ডর ভ্যারিয়েন্টের জন্য নির্দিষ্ট হয়ে থাকে।

উদাহরণস্বরূপ, নিম্নলিখিত Android.bp libexample এবং libexample_ext সংজ্ঞায়িত করা হয়েছে:

cc_library {
    name: "libexample",
    srcs: ["src/example.c"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
    target: {
        vendor: {
            cflags: ["-DLIBEXAMPLE_ENABLE_VNDK=1"],
        },
    },
}

cc_library {
    name: "libexample_ext",
    srcs: ["src/example.c"],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample",
    },
    cflags: [
        "-DLIBEXAMPLE_ENABLE_VNDK=1",
        "-DLIBEXAMPLE_ENABLE_VNDK_EXT=1",
    ],
}

এবং এটি হলো src/example.c ফাইলের কোড তালিকা:

void all() { }

#if !defined(LIBEXAMPLE_ENABLE_VNDK)
void framework_only() { }
#endif

#if defined(LIBEXAMPLE_ENABLE_VNDK)
void vndk() { }
#endif

#if defined(LIBEXAMPLE_ENABLE_VNDK_EXT)
void vndk_ext() { }
#endif

এই দুটি ফাইল অনুসারে, বিল্ড সিস্টেম নিম্নলিখিত এক্সপোর্টেড সিম্বলসহ শেয়ার্ড লাইব্রেরি তৈরি করে:

ইনস্টলেশন পথ রপ্তানিকৃত প্রতীক
/system/lib[64]/libexample.so all , framework_only
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so all , vndk
/vendor/lib[64]/vndk/libexample.so all , vndk , vndk_ext

রপ্তানিকৃত প্রতীকগুলির উপর প্রয়োজনীয়তা

VNDK ABI চেকারটি VNDK ভেন্ডর ভ্যারিয়েন্ট এবং VNDK এক্সটেনশনগুলির ABI-কে prebuilts/abi-dumps/vndk অধীনে থাকা রেফারেন্স ABI ডাম্পগুলির সাথে তুলনা করে।

  • VNDK ভেন্ডর ভেরিয়েন্ট দ্বারা এক্সপোর্ট করা সিম্বল (যেমন /apex/com.android.vndk.v${VER}/lib[64]/libexample.so ) অবশ্যই ABI ডাম্পে সংজ্ঞায়িত সিম্বলগুলির সাথে অভিন্ন হতে হবে (সুপারসেট নয়)।
  • VNDK এক্সটেনশন দ্বারা রপ্তানি করা প্রতীকগুলি (যেমন /vendor/lib[64]/vndk/libexample.so ) অবশ্যই ABI ডাম্পে সংজ্ঞায়িত প্রতীকগুলির সুপারসেট হতে হবে।

যদি VNDK ভেন্ডর ভ্যারিয়েন্ট বা VNDK এক্সটেনশনগুলো উপরোক্ত শর্তাবলী অনুসরণ করতে ব্যর্থ হয়, তাহলে VNDK ABI চেকার বিল্ড এরর দেখায় এবং বিল্ডটি থামিয়ে দেয়।

ভেন্ডর ভ্যারিয়েন্ট থেকে সোর্স ফাইল বা শেয়ার্ড লাইব্রেরি বাদ দিন

ভেন্ডর ভ্যারিয়েন্ট থেকে সোর্স ফাইল বাদ দিতে, সেগুলোকে exclude_srcs প্রপার্টিতে যোগ করুন। একইভাবে, শেয়ার্ড লাইব্রেরিগুলো যাতে ভেন্ডর ভ্যারিয়েন্টের সাথে লিঙ্ক না হয়, তা নিশ্চিত করতে সেই লাইব্রেরিগুলোকে exclude_shared_libs প্রপার্টিতে যোগ করুন। উদাহরণস্বরূপ:

cc_library {
    name: "libexample_cond_exclude",
    srcs: ["fwk.c", "both.c"],
    shared_libs: ["libfwk_only", "libboth"],
    vendor_available: true,
    target: {
        vendor: {
            exclude_srcs: ["fwk.c"],
            exclude_shared_libs: ["libfwk_only"],
        },
    },
}

এই উদাহরণে, libexample_cond_exclude এর কোর ভ্যারিয়েন্টটি fwk.c এবং both.c থেকে কোড অন্তর্ভুক্ত করে এবং libfwk_onlylibboth শেয়ার্ড লাইব্রেরিগুলোর উপর নির্ভর করে। libexample_cond_exclude এর ভেন্ডর ভ্যারিয়েন্টটি শুধুমাত্র both.c থেকে কোড অন্তর্ভুক্ত করে, কারণ exclude_srcs প্রপার্টির মাধ্যমে fwk.c বাদ দেওয়া হয়েছে। একইভাবে, এটি শুধুমাত্র libboth শেয়ার্ড লাইব্রেরির উপর নির্ভর করে, কারণ exclude_shared_libs প্রপার্টির মাধ্যমে libfwk_only বাদ দেওয়া হয়েছে।

VNDK এক্সটেনশন থেকে হেডার রপ্তানি করুন

একটি VNDK এক্সটেনশন কোনো VNDK শেয়ার্ড লাইব্রেরিতে নতুন ক্লাস বা নতুন ফাংশন যোগ করতে পারে। এই ডিক্লারেশনগুলোকে স্বতন্ত্র হেডারে রাখার এবং বিদ্যমান হেডারগুলো পরিবর্তন করা থেকে বিরত থাকার পরামর্শ দেওয়া হয়।

উদাহরণস্বরূপ, VNDK এক্সটেনশন libexample_ext এর জন্য include-ext/example/ext/feature_name.h একটি নতুন হেডার ফাইল তৈরি করা হয়:

  • অ্যান্ড্রয়েড.বিপি
  • include-ext/example/ext/feature_name.h
  • include/example/example.h
  • src/example.c
  • src/ext/feature_name.c

নিম্নলিখিত Android.bp তে, libexample শুধুমাত্র include এক্সপোর্ট করে, যেখানে libexample_ext include এবং include-ext উভয়ই এক্সপোর্ট করে। এটি নিশ্চিত করে যে libexample এর ব্যবহারকারীরা feature_name.h ভুলভাবে অন্তর্ভুক্ত করবে না।

cc_library {
    name: "libexample",
    srcs: ["src/example.c"],
    export_include_dirs: ["include"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libexample_ext",
    srcs: [
        "src/example.c",
        "src/ext/feature_name.c",
    ],
    export_include_dirs: [
        "include",
        "include-ext",
    ],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample",
    },
}

যদি এক্সটেনশনগুলোকে স্বাধীন হেডার ফাইলে আলাদা করা সম্ভব না হয়, তবে একটি বিকল্প হলো #ifdef গার্ড যোগ করা। তবে, নিশ্চিত করুন যে সমস্ত VNDK এক্সটেনশন ব্যবহারকারী ডিফাইন ফ্ল্যাগগুলো যোগ করেছেন। আপনি cflags এ ডিফাইন ফ্ল্যাগ যোগ করতে এবং shared_libs সাথে শেয়ার্ড লাইব্রেরি লিঙ্ক করতে cc_defaults ডিফাইন করতে পারেন।

উদাহরণস্বরূপ, VNDK এক্সটেনশন libexample2_extExample2::get_b() একটি নতুন মেম্বার ফাংশন যোগ করতে হলে, আপনাকে বিদ্যমান হেডার ফাইলটি পরিবর্তন করতে হবে এবং একটি #ifdef গার্ড যোগ করতে হবে:

#ifndef LIBEXAMPLE2_EXAMPLE_H_
#define LIBEXAMPLE2_EXAMPLE_H_

class Example2 {
 public:
  Example2();

  void get_a();

#ifdef LIBEXAMPLE2_ENABLE_VNDK_EXT
  void get_b();
#endif

 private:
  void *impl_;
};

#endif  // LIBEXAMPLE2_EXAMPLE_H_

libexample2_ext এর ব্যবহারকারীদের জন্য libexample2_ext_defaults নামে একটি cc_defaults সংজ্ঞায়িত করা হয়েছে:

cc_library {
    name: "libexample2",
    srcs: ["src/example2.cpp"],
    export_include_dirs: ["include"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libexample2_ext",
    srcs: ["src/example2.cpp"],
    export_include_dirs: ["include"],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample2",
    },
    cflags: [
        "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1",
    ],
}

cc_defaults {
    name: "libexample2_ext_defaults",
    shared_libs: [
        "libexample2_ext",
    ],
    cflags: [
        "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1",
    ],
}

libexample2_ext এর ব্যবহারকারীরা তাদের defaults প্রপার্টিতে সরাসরি libexample2_ext_defaults অন্তর্ভুক্ত করতে পারেন:

cc_binary {
    name: "example2_user_executable",
    defaults: ["libexample2_ext_defaults"],
    vendor: true,
}

পণ্যের প্যাকেজ

অ্যান্ড্রয়েড বিল্ড সিস্টেমে, PRODUCT_PACKAGES ভেরিয়েবলটি সেইসব এক্সিকিউটেবল, শেয়ার্ড লাইব্রেরি বা প্যাকেজ নির্দিষ্ট করে যা ডিভাইসে ইনস্টল করা হবে। নির্দিষ্ট মডিউলগুলোর ট্রানজিটিভ ডিপেন্ডেন্সিগুলোও ডিভাইসে স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে যায়।

যদি BOARD_VNDK_VERSION সক্রিয় করা থাকে, তাহলে vendor_available বা vndk.enabled যুক্ত মডিউলগুলো বিশেষ সুবিধা পায়। যদি কোনো ফ্রেমওয়ার্ক মডিউল vendor_available বা vndk.enabled যুক্ত কোনো মডিউলের উপর নির্ভরশীল হয়, তাহলে কোর ভ্যারিয়েন্টটি ট্রানজিটিভ ইনস্টলেশন সেটে অন্তর্ভুক্ত করা হয়। যদি কোনো ভেন্ডর মডিউল vendor_available যুক্ত কোনো মডিউলের উপর নির্ভরশীল হয়, তাহলে ভেন্ডর ভ্যারিয়েন্টটি ট্রানজিটিভ ইনস্টলেশন সেটে অন্তর্ভুক্ত করা হয়। তবে, vndk.enabled যুক্ত মডিউলগুলোর ভেন্ডর ভ্যারিয়েন্টগুলো ভেন্ডর মডিউল দ্বারা ব্যবহৃত হোক বা না হোক, ইনস্টল করা হয়।

যখন ডিপেন্ডেন্সিগুলো বিল্ড সিস্টেমের কাছে অদৃশ্য থাকে (যেমন শেয়ার্ড লাইব্রেরি যা রানটাইমে dlopen() দিয়ে খোলা হতে পারে), তখন সেই মডিউলগুলো স্পষ্টভাবে ইনস্টল করার জন্য PRODUCT_PACKAGES এ মডিউলের নাম উল্লেখ করা উচিত।

যদি কোনো মডিউলে vendor_available বা vndk.enabled থাকে, তাহলে মডিউলের নামটি তার কোর ভ্যারিয়েন্টকে বোঝায়। PRODUCT_PACKAGES এ ভেন্ডর ভ্যারিয়েন্টটি স্পষ্টভাবে উল্লেখ করতে, মডিউলের নামের শেষে একটি .vendor সাফিক্স যুক্ত করুন। উদাহরণস্বরূপ:

cc_library {
    name: "libexample",
    srcs: ["example.c"],
    vendor_available: true,
}

এই উদাহরণে, libexample বলতে /system/lib[64]/libexample.so এবং libexample.vendor বলতে /vendor/lib[64]/libexample.so বোঝানো হয়েছে। /vendor/lib[64]/libexample.so ইনস্টল করতে, PRODUCT_PACKAGESlibexample.vendor যোগ করুন:

PRODUCT_PACKAGES += libexample.vendor