VNDK বিল্ড সিস্টেম সংক্রান্ত সহায়তা

Android 8.1 ও এর পরের যেকোনও ভার্সনে, বিল্ড সিস্টেমে বিল্ট-ইন VNDK সহায়তা থাকে। VNDK সাপোর্ট চালু করা থাকলে, বিল্ড সিস্টেম মডিউলগুলির মধ্যে ডিপেন্ডেন্সি চেক করে, ভেন্ডর মডিউলের জন্য ভেন্ডর-নির্দিষ্ট ভেরিয়েন্ট বিল্ড করে এবং নির্ধারিত ডিরেক্টরিতে অটোমেটিক সেইসব মডিউল ইনস্টল করে।

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

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

libexample vendor_available:true and 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।

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

বিল্ড সহায়তা কনফিগার করা

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

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

ছবি ২. VNDK APEX.

মডিউলের সংজ্ঞা

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

ভেন্ডর মডিউল

ভেন্ডর মডিউল হল ভেন্ডর-নির্দিষ্ট এক্সিকিউটেবল বা শেয়ার করা লাইব্রেরি যা ভেন্ডর পার্টিশনে ইনস্টল করতে হবে। Android.bp ফাইলে, ভেন্ডর মডিউলকে অবশ্যই ভেন্ডর বা মালিকানাধীন প্রপার্টিকে 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_libs ও shared_libs-এর উপর এবং Android.mk-এর মধ্যে থাকা LOCAL_HEADER_LIBRARIES, LOCAL_STATIC_LIBRARIES ও LOCAL_SHARED_LIBRARIES-এর উপর প্রযোজ্য হয়।

LL-NDK

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* ট্যাগ নেই অথবা ট্যাগটি টার্গেটের সাথে ম্যাচ করে।

VNDK

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 হলে, দুটি ভেরিয়েন্ট (কোর ও ভেন্ডর) তৈরি করা হতে পারে। কোর ভ্যারিয়েন্টকে ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর ভ্যারিয়েন্টকে ভেন্ডর মডিউল হিসেবে বিবেচনা করতে হবে। কিছু ফ্রেমওয়ার্ক মডিউল যদি এই মডিউলের উপর নির্ভর করে, তাহলে কোর ভ্যারিয়েন্ট তৈরি করা হয়। কিছু ভেন্ডর মডিউল এই মডিউলের উপর নির্ভর করলে, ভেন্ডর ভেরিয়েন্ট তৈরি করা হয়। বিল্ড সিস্টেম নিম্নলিখিত ডিপেন্ডেন্সি চেক এনফোর্স করে:

  • কোর ভ্যারিয়েন্ট সবসময় শুধুমাত্র ফ্রেমওয়ার্ক-নির্ভর হয় এবং ভেন্ডর মডিউলের অ্যাক্সেস থাকে না।
  • ফ্রেমওয়ার্ক মডিউল সবসময় ভেন্ডর ভ্যারিয়েন্ট অ্যাক্সেস করতে পারে না।
  • ভেন্ডর ভেরিয়েন্টের সব ডিপেন্ডেন্সি, যা 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})-এ ইনস্টল করা হয়।

নিচের সারণীতে কীভাবে বিল্ড সিস্টেম ভেন্ডর ভেরিয়েন্ট ম্যানেজ করে তার সংক্ষিপ্তসার দেওয়া হল:

vendor_available
vndk চালু করা আছে
vndk
support_system_process
ভেন্ডর ভেরিয়েন্ট বিবরণ
true false false ভেন্ডর ভ্যারিয়েন্ট হল VND-ONLY। শেয়ার করা লাইব্রেরি /vendor/lib[64]-এ ইনস্টল করা হয়।
true ভুল (বিল্ড সংক্রান্ত সমস্যা)
true false ভেন্ডর ভ্যারিয়েন্ট হল VNDK. শেয়ার করা লাইব্রেরি VNDK APEX-এ ইনস্টল করা হয়।
true ভেন্ডর ভেরিয়েন্ট হল VNDK-SP। শেয়ার করা লাইব্রেরি VNDK APEX-এ ইনস্টল করা আছে।

false

false

false

কোনও ভেন্ডর ভেরিয়েন্ট নেই। এই মডিউলটি FWK-ONLY.

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 9 এবং তার পরবর্তী ভার্সনে, 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)

কন্ডিশনাল কম্পাইলার ফ্ল্যাগ

Android বিল্ড সিস্টেম ডিফল্ট হিসেবে ভেন্ডর ভ্যারিয়েন্ট ও 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_only ও libboth শেয়ার করা লাইব্রেরির উপর নির্ভর করে। libexample_cond_exclude-এর ভেন্ডর ভেরিয়েন্টে শুধু both.c-এর কোড অন্তর্ভুক্ত থাকে কারণ fwk.c-কে exclude_srcs প্রপার্টি বাদ দেয়। একইভাবে, এটি শুধুমাত্র শেয়ার করা লাইব্রেরি libboth-এর উপর নির্ভর করে কারণ libfwk_only-কে exclude_shared_libs প্রপার্টি বাদ দেয়।

VNDK এক্সটেনশন থেকে হেডার এক্সপোর্ট করা

VNDK এক্সটেনশন, VNDK শেয়ার করা লাইব্রেরিতে নতুন ক্লাস বা নতুন ফাংশন যোগ করতে পারে। এইসব ঘোষণা আলাদা হেডার হিসেবে রাখলে ভালো হয় এবং আগে থেকে থাকা হেডার পরিবর্তন না করাই ভালো।

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

  • Android.bp
  • 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 এক্সটেনশন ব্যবহারকারী যাতে ডিফাইন ফ্ল্যাগ যোগ করেন তা নিশ্চিত করুন। আপনি cc_defaults-কে cflags-এ ডিফাইন ফ্ল্যাগ যোগ করতে এবং shared_libs-এর সাথে শেয়ার করা লাইব্রেরি লিঙ্ক করতে ডিফাইন করতে পারেন।

যেমন, VNDK এক্সটেনশনে libexample2_ext নতুন মেম্বার ফাংশন Example2::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,
}

প্রোডাক্ট প্যাকেজ

Android বিল্ড সিস্টেমে, 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_PACKAGES-এ libexample.vendor যোগ করুন:

PRODUCT_PACKAGES += libexample.vendor