Android 8.1 ও এর পরের যেকোনও ভার্সনে, বিল্ড সিস্টেমে বিল্ট-ইন VNDK সহায়তা থাকে। VNDK সাপোর্ট চালু করা থাকলে, বিল্ড সিস্টেম মডিউলগুলির মধ্যে ডিপেন্ডেন্সি চেক করে, ভেন্ডর মডিউলের জন্য ভেন্ডর-নির্দিষ্ট ভেরিয়েন্ট বিল্ড করে এবং নির্ধারিত ডিরেক্টরিতে অটোমেটিক সেইসব মডিউল ইনস্টল করে।
VNDK বিল্ড সাপোর্ট সংক্রান্ত উদাহরণ
এই উদাহরণে, Android.bp মডিউল সংজ্ঞা একটি libexample নামের
লাইব্রেরি সংজ্ঞায়িত করে। vendor_available
প্রপার্টি থেকে বোঝা যায় যে ফ্রেমওয়ার্ক মডিউল ও ভেন্ডর মডিউল
libexample-এর উপর নির্ভর করতে পারে:
ছবি ১. সহায়তা চালু করা হয়েছে।
ফ্রেমওয়ার্ক এক্সিকিউটেবল /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/includeframeworks/native/includeframeworks/native/opengl/includehardware/libhardware/includehardware/libhardware_legacy/includehardware/ril/includelibnativehelper/includelibnativehelper/include_deprecatedsystem/core/includesystem/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 তৈরি করতে, আপনাকে অবশ্যই 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_availabletrueহলে, সব ভেন্ডর মডিউল ভেন্ডর ভ্যারিয়েন্ট অ্যাক্সেস করতে পারবে।vendor_availablefalseহলে, ভেন্ডর ভ্যারিয়েন্ট শুধুমাত্র অন্যান্য VNDK বা VNDK-SP মডিউলের (অর্থাৎ,vendor:trueমডিউলvendor_available:falseমডিউলের সাথে লিঙ্ক করতে পারে না) অ্যাক্সেস করতে পারে।
cc_library বা
cc_library_shared-এর ডিফল্ট ইনস্টলেশন পাথ নিম্নলিখিত নিয়ম অনুযায়ী নির্ধারিত হয়:
/system/lib[64]-এ মূল ভেরিয়েন্ট ইনস্টল করা আছে।- ভেন্ডর ভেরিয়েন্ট ইনস্টল করার পাথ আলাদা হতে পারে:
vndk.enabledfalseহলে, ভেন্ডর ভেরিয়েন্ট/vendor/lib[64]-এ ইনস্টল করা হয়।vndk.enabledtrueহলে, ভেন্ডর ভেরিয়েন্ট 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-এ ইনস্টল করা আছে। | ||
|
|
|
কোনও ভেন্ডর ভেরিয়েন্ট নেই। এই মডিউলটি 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