অ্যান্ড্রয়েড 8.1 এবং উচ্চতর, বিল্ড সিস্টেমে বিল্ট-ইন ভিএনডিকে সমর্থন রয়েছে। VNDK সমর্থন সক্রিয় করা হলে, বিল্ড সিস্টেম মডিউলগুলির মধ্যে নির্ভরতা পরীক্ষা করে, বিক্রেতা মডিউলগুলির জন্য একটি বিক্রেতা-নির্দিষ্ট বৈকল্পিক তৈরি করে এবং স্বয়ংক্রিয়ভাবে সেই মডিউলগুলিকে মনোনীত ডিরেক্টরিগুলিতে ইনস্টল করে।
ভিএনডিকে বিল্ড সমর্থন উদাহরণ
এই উদাহরণে, Android.bp
মডিউল সংজ্ঞা libexample
নামে একটি লাইব্রেরি সংজ্ঞায়িত করে। vendor_available
প্রপার্টি নির্দেশ করে ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর মডিউল libexample
এর উপর নির্ভর করতে পারে:
চিত্র 1. সমর্থন সক্রিয়।
ফ্রেমওয়ার্ক এক্সিকিউটেবল /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.mk
এ BOARD_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
সাথে নির্ভরতাগুলি নির্দিষ্ট করতে হবে (স্পষ্টভাবে)।
ভিএনডিকে এপেক্স
অ্যান্ড্রয়েড 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}
থেকে পাওয়া যায়।
চিত্র 2. 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 ভাগ করা লাইব্রেরিগুলি স্থিতিশীল 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
হলে, দুটি রূপ ( কোর এবং বিক্রেতা ) নির্মিত হতে পারে। মূল বৈকল্পিকটিকে একটি ফ্রেমওয়ার্ক মডিউল হিসাবে বিবেচনা করা উচিত এবং বিক্রেতা বৈকল্পিকটিকে একটি বিক্রেতা মডিউল হিসাবে বিবেচনা করা উচিত। যদি কিছু ফ্রেমওয়ার্ক মডিউল এই মডিউলের উপর নির্ভর করে, তাহলে মূল বৈকল্পিকটি নির্মিত হয়। যদি কিছু বিক্রেতা মডিউল এই মডিউলের উপর নির্ভর করে, তবে বিক্রেতা বৈকল্পিকটি নির্মিত হয়। বিল্ড সিস্টেম নিম্নলিখিত নির্ভরতা চেক প্রয়োগ করে:
- মূল বৈকল্পিক সর্বদা ফ্রেমওয়ার্ক-কেবল এবং বিক্রেতা মডিউলগুলির কাছে অ্যাক্সেসযোগ্য নয়।
- বিক্রেতা বৈকল্পিক সবসময় ফ্রেমওয়ার্ক মডিউলগুলির কাছে অ্যাক্সেসযোগ্য নয়৷
- ভেন্ডর ভেরিয়েন্টের সমস্ত নির্ভরতা, যা
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 সমর্থন_একই_প্রক্রিয়া | বিক্রেতা বৈকল্পিক বিবরণ |
---|---|---|---|
true | false | false | বিক্রেতা ভেরিয়েন্ট VND-শুধুমাত্র । শেয়ার্ড লাইব্রেরি /vendor/lib[64] এ ইনস্টল করা হয়। |
true | অবৈধ (বিল্ড ত্রুটি) | ||
true | false | বিক্রেতার রূপগুলি হল VNDK । শেয়ার্ড লাইব্রেরি VNDK APEX-এ ইনস্টল করা আছে। | |
true | বিক্রেতার রূপগুলি হল VNDK-SP । শেয়ার্ড লাইব্রেরি VNDK APEX-এ ইনস্টল করা আছে। | ||
| | | কোন বিক্রেতা বৈকল্পিক. এই মডিউলটি শুধুমাত্র FWK-এর জন্য । |
true | অবৈধ (বিল্ড ত্রুটি) | ||
true | false | বিক্রেতা ভেরিয়েন্ট VNDK-প্রাইভেট । শেয়ার্ড লাইব্রেরি 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
)
শর্তাধীন কম্পাইলার পতাকা
অ্যান্ড্রয়েড বিল্ড সিস্টেম ডিফল্টরূপে ভেন্ডর ভেরিয়েন্ট এবং VNDK এক্সটেনশনের জন্য __ANDROID_VNDK__
সংজ্ঞায়িত করে। আপনি সি প্রিপ্রসেসর গার্ডের সাথে কোডটি রক্ষা করতে পারেন:
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 ভেন্ডর ভেরিয়েন্টের ABI এবং VNDK এক্সটেনশনগুলিকে 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
। এটি নিশ্চিত করে feature_name.h
ভুলভাবে libexample
এর ব্যবহারকারীদের দ্বারা অন্তর্ভুক্ত করা হবে না:
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
এ ডিফাইন ফ্ল্যাগ যোগ করতে cc_defaults
নির্ধারণ করতে পারেন এবং 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_defaults
নামের একটি cc_defaults
libexample2_ext
ব্যবহারকারীদের জন্য সংজ্ঞায়িত করা হয়েছে:
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_PACKAGES
এ libexample.vendor
যোগ করুন:
PRODUCT_PACKAGES += libexample.vendor