Treble VNDK ডিজাইনে ডায়নামিক লিঙ্কার দুটি চ্যালেঞ্জ সমাধান করে:
- SP-HAL শেয়ার করা লাইব্রেরি ও সেগুলির ডিপেন্ডেন্সি, যার মধ্যে VNDK-SP লাইব্রেরিও রয়েছে, সেগুলি ফ্রেমওয়ার্ক প্রসেসে লোড করা হয়। প্রতীক সংক্রান্ত বিরোধ এড়াতে কিছু মেকানিজম থাকা উচিত।
dlopen()এবংandroid_dlopen_ext()কিছু রানটাইম ডিপেন্ডেন্সি যোগ করতে পারে যা বিল্ড টাইমে দেখা যায় না এবং স্ট্যাটিক অ্যানালিসিস ব্যবহার করে শনাক্ত করা কঠিন হতে পারে।
এই দুটি চ্যালেঞ্জ লিঙ্কার নেমস্পেস মেকানিজমের মাধ্যমে সমাধান করা যেতে পারে। এই মেকানিজম ডায়নামিক লিঙ্কার প্রদান করে। এটি বিভিন্ন লিঙ্কার নেমস্পেসে শেয়ার করা লাইব্রেরি আলাদা করতে পারে যাতে একই লাইব্রেরির নাম কিন্তু আলাদা চিহ্ন সহ লাইব্রেরিগুলি একে অপরের সাথে বিরোধ না করে।
অন্যদিকে, লিঙ্কার নেমস্পেস মেকানিজম এমন নমনীয়তা প্রদান করে যাতে কিছু শেয়ার করা লাইব্রেরি লিঙ্কার নেমস্পেসের মাধ্যমে এক্সপোর্ট করা যায় এবং অন্য লিঙ্কার নেমস্পেসের মাধ্যমে ব্যবহার করা যায়। এই এক্সপোর্ট করা শেয়ার্ড লাইব্রেরিগুলি অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস হয়ে যেতে পারে যা অন্যান্য প্রোগ্রামের জন্য সর্বজনীন হলেও তাদের লিঙ্কার নেমস্পেসের মধ্যে তাদের প্রয়োগের বিবরণ লুকিয়ে রাখে।
যেমন, /system/lib[64]/libcutils.so এবং
/system/lib[64]/vndk-sp-${VER}/libcutils.so হল দুটি শেয়ার করা
লাইব্রেরি। এই দুটি লাইব্রেরিতে আলাদা আলাদা প্রতীক থাকতে পারে। এগুলি বিভিন্ন লিঙ্কার নেমস্পেসে লোড করা হয় যাতে ফ্রেমওয়ার্ক মডিউল /system/lib[64]/libcutils.so-এর উপর নির্ভর করতে পারে এবং SP-HAL শেয়ার করা লাইব্রেরি /system/lib[64]/vndk-sp-${VER}/libcutils.so-এর উপর নির্ভর করতে পারে।
অন্যদিকে, /system/lib[64]/libc.so হল একটি পাবলিক লাইব্রেরির উদাহরণ
যা একটি লিঙ্কার নেমস্পেস দ্বারা এক্সপোর্ট করা হয় এবং
অনেক লিঙ্কার নেমস্পেসে ইমপোর্ট করা হয়। /system/lib[64]/libc.so-এর
ডিপেন্ডেন্সি, যেমন libnetd_client.so,
/system/lib[64]/libc.so
যে নেমস্পেসে থাকে সেখানে লোড করা হয়। অন্যান্য নেমস্পেসের সেইসব ডিপেন্ডেন্সিতে অ্যাক্সেস থাকবে না। এই
মেকানিজম পাবলিক ইন্টারফেস প্রদান করার সময় ইমপ্লিমেন্টেশনের বিবরণ এনক্যাপসুলেট করে।
এটি কীভাবে কাজ করে
DT_NEEDED এন্ট্রি বা dlopen() বা android_dlopen_ext()-এর আর্গুমেন্টে নির্দিষ্ট করা শেয়ার করা লাইব্রেরি লোড করার দায়িত্ব
ডায়নামিক লিঙ্কারের। দুটি ক্ষেত্রেই, ডায়নামিক লিঙ্কার সেই লিঙ্কার নেমস্পেস খুঁজে বের করে যেখানে কলার
থাকে এবং একই লিঙ্কার নেমস্পেসে ডিপেন্ডেন্সি লোড করার চেষ্টা করে। যদি
ডায়নামিক লিঙ্কার নির্দিষ্ট লিঙ্কার নেমস্পেসে শেয়ার করা লাইব্রেরি লোড করতে না পারে, তাহলে এটি
এক্সপোর্ট করা শেয়ার করা লাইব্রেরির জন্য লিঙ্ক করা লিঙ্কার নেমস্পেস-কে জিজ্ঞাসা করে।
কনফিগারেশন ফাইল ফর্ম্যাট
কনফিগারেশন ফাইলের ফর্ম্যাট INI ফাইল ফর্ম্যাটের উপর ভিত্তি করে তৈরি করা হয়। সাধারণত কনফিগারেশন ফাইল এইরকম দেখতে হয়:
dir.system = /system/bin dir.system = /system/xbin dir.vendor = /vendor/bin [system] additional.namespaces = sphal,vndk namespace.default.isolated = true namespace.default.search.paths = /system/${LIB} namespace.default.permitted.paths = /system/${LIB}/hw namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB} namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw namespace.sphal.isolated = true namespace.sphal.visible = true namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB} namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB} namespace.sphal.asan.search.paths = /data/asan/odm/${LIB}:/odm/${LIB} namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB} namespace.sphal.asan.permitted.paths = /data/asan/odm/${LIB}:/odm/${LIB} namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB} namespace.sphal.links = default,vndk namespace.sphal.link.default.shared_libs = libc.so:libm.so namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so namespace.vndk.isolated = true namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29 namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29 namespace.vndk.links = default namespace.vndk.link.default.shared_libs = libc.so:libm.so [vendor] namespace.default.isolated = false namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}
কনফিগারেশন ফাইলে এগুলি অন্তর্ভুক্ত:
- কার্যকরী বিভাগ বেছে নেওয়ার জন্য ডায়নামিক লিঙ্কারের শুরুতে একাধিক ডিরেক্টরি-বিভাগ ম্যাপিং প্রপার্টি।
-
লিঙ্কার নেমস্পেস কনফিগারেশন সংক্রান্ত একাধিক বিভাগ:
- প্রতিটি বিভাগে একাধিক নেমস্পেস (গ্রাফ ভার্টেক্স) এবং নেমস্পেসের মধ্যে একাধিক ফলব্যাক লিঙ্ক (গ্রাফ আর্ক) থাকে।
- প্রতিটি নেমস্পেসের নিজস্ব আইসোলেশন, সার্চ পাথ, অনুমোদিত পাথ, এবং দৃশ্যমানতা সেটিংস থাকে।
নিচের সারণীতে প্রতিটি প্রপার্টির অর্থ বিস্তারিতভাবে বর্ণনা করা হয়েছে।
ডিরেক্টরি-বিভাগ ম্যাপিং প্রপার্টি
| প্রপার্টি | বর্ণনা | উদাহরণ |
|---|---|---|
|
প্রতিটি প্রপার্টি ডিরেক্টরির অধীনে এক্সিকিউটেবলকে লিঙ্কার
নেমস্পেস কনফিগারেশন বিভাগে ম্যাপ করে। দুটি (বা তার বেশি) প্রপার্টি থাকতে পারে
যেগুলির একই |
এটি থেকে বোঝা যায় যে
|
সম্পর্কিত প্রপার্টি
| প্রপার্টি | বর্ণনা | উদাহরণ |
|---|---|---|
additional. |
বিভাগের জন্য অতিরিক্ত নেমস্পেসের কমা-দ্বারা আলাদা করা তালিকা ( |
এর থেকে বোঝা যায় যে |
namespace. |
কমা দিয়ে আলাদা করা ফলব্যাক নেমস্পেসের তালিকা। শেয়ার করা লাইব্রেরি বর্তমান নেমস্পেসে খুঁজে না পাওয়া গেলে, ডায়নামিক লিঙ্কার ফলব্যাক নেমস্পেস থেকে শেয়ার করা লাইব্রেরি লোড করার চেষ্টা করে। তালিকার শুরুতে উল্লেখ করা নেমস্পেসের অগ্রাধিকার বেশি। সার্চ করে না। |
কোনও শেয়ার করা লাইব্রেরি বা এক্সিকিউটেবল যদি এমন কোনও শেয়ার করা লাইব্রেরির জন্য অনুরোধ করে যা
তারপরে, শেয়ার করা লাইব্রেরি যদি
সব চেষ্টা ব্যর্থ হলে, ডায়নামিক লিঙ্কার একটি সমস্যা রিটার্ন করে। |
namespace. |
শেয়ার করা লাইব্রেরির কোলন-সেপারেটেড তালিকা যা
এই প্রপার্টি |
এটি ইঙ্গিত করে যে ফলব্যাক লিঙ্কটি অনুরোধ করা লাইব্রেরির নাম হিসেবে শুধুমাত্র |
namespace. |
একটি বুলিয়ান ভ্যালু যা নির্দেশ করে যে সমস্ত শেয়ার করা লাইব্রেরি এই প্রপার্টিটি
|
এর থেকে বোঝা যায় যে সব লাইব্রেরির নাম ফলব্যাক লিঙ্কের
মাধ্যমে |
নেমস্পেস প্রপার্টি
| প্রপার্টি | বর্ণনা | উদাহরণ |
|---|---|---|
namespace. |
ডায়নামিক লিঙ্কারকে শেয়ার করা লাইব্রেরি কোথায় আছে তা চেক করতে হবে কিনা তা বোঝাতে বুলিয়ান ভ্যালু।
|
এর থেকে বোঝা যায় যে শুধুমাত্র |
namespace. |
শেয়ার করা লাইব্রেরি সার্চ করার জন্য কোলন দিয়ে আলাদা করা ডিরেক্টরির তালিকা।
যেমন, |
এটি ইঙ্গিত করে যে ডায়নামিক লিঙ্কার শেয়ার করা লাইব্রেরির জন্য
|
namespace. |
AddressSanitizer (ASan) চালু করা থাকলে, শেয়ার করা লাইব্রেরি সার্চ করার জন্য কোলন দিয়ে আলাদা করা ডিরেক্টরির তালিকা। ASan চালু থাকলে
|
এর থেকে বোঝা যায় যে
ASan চালু থাকলে, ডায়নামিক লিঙ্কার
|
namespace. |
কোলন দিয়ে আলাদা করা ডিরেক্টরির তালিকা (সাবডিরেক্টরি সহ) যেখানে
এছাড়াও,
|
এর থেকে বোঝা যায় যে
যেমন, |
namespace. |
ASan চালু করা থাকলে, ডাইনামিক লিঙ্কার শেয়ার করা লাইব্রেরি লোড করতে পারে এমন কোলন-সেপারেটেড ডিরেক্টরির তালিকা। ASan চালু থাকলে |
এটি দেখায় যে ASan চালু করা থাকলে
|
namespace. |
একটি বুলিয়ান ভ্যালু যা নির্দেশ করে যে প্রোগ্রামটি (
|
এর থেকে বোঝা যায় যে |
লিঙ্কার নেমস্পেস তৈরি করা
Android 11-এ, লিঙ্কার কনফিগারেশন
/linkerconfig-এর অধীনে রানটাইমে তৈরি করা হয়, এর পরিবর্তে
${android-src}/system/core/rootdir/etc-এ প্লেন টেক্সট ফাইল ব্যবহার করা হয়। রানটাইম এনভায়রনমেন্টের উপর ভিত্তি করে বুট
টাইমে কনফিগারেশন তৈরি করা হয়, যার মধ্যে নিম্নলিখিত আইটেম অন্তর্ভুক্ত:
- ডিভাইসে VNDK কাজ করলে
- ভেন্ডর পার্টিশনের টার্গেট VNDK ভার্সন
- প্রোডাক্ট পার্টিশনের VNDK ভার্সন
- ইনস্টল করা APEX মডিউল
লিঙ্কার নেমস্পেসের মধ্যে ডিপেন্ডেন্সি সমাধান করে লিঙ্কার কনফিগারেশন তৈরি করা হয়। যেমন, নির্ভরতা সংক্রান্ত আপডেট সহ APEX মডিউলে কোনও আপডেট থাকলে, লিঙ্কার
কনফিগারেশন তৈরি করা হয় যা এইসব পরিবর্তনকে প্রতিফলিত করে। লিঙ্কার কনফিগারেশন তৈরি করার ব্যাপারে আরও বিবরণ
${android-src}/system/linkerconfig-এ
পাওয়া যাবে।
লিঙ্কার নেমস্পেস আইসোলেশন
তিন ধরনের কনফিগারেশন আছে। BoardConfig.mk-এ PRODUCT_TREBLE_LINKER_NAMESPACES এবং
BOARD_VNDK_VERSION-এর ভ্যালুর উপর নির্ভর করে, বুট করার সময় সংশ্লিষ্ট কনফিগারেশন জেনারেট করা হয়।
PRODUCT_TREBLE_LINKER_NAMESPACES |
BOARD_VNDK_VERSION |
বেছে নেওয়া কনফিগারেশন | VTS সংক্রান্ত প্রয়োজনীয়তা |
|---|---|---|---|
true |
current |
VNDK |
Android 9 বা এর পরের যেকোনও ভার্সন সহ লঞ্চ করা ডিভাইসের জন্য বাধ্যতামূলক |
| ফাঁকা | VNDK Lite |
Android 8.x ভার্সন সহ লঞ্চ করা ডিভাইসের জন্য বাধ্যতামূলক | |
false |
ফাঁকা | Legacy |
নন-ট্রেবেল ডিভাইসের জন্য |
VNDK Lite কনফিগারেশন SP-HAL এবং VNDK-SP শেয়ার করা লাইব্রেরি আলাদা করে। Android 8.0-এ,
PRODUCT_TREBLE_LINKER_NAMESPACES, true হলে এটি অবশ্যই ডায়নামিক লিঙ্কারের জন্য কনফিগারেশন ফাইল হতে হবে।
এছাড়াও, VNDK কনফিগারেশন SP-HAL এবং VNDK-SP শেয়ার করা লাইব্রেরি আলাদা করে। এছাড়াও, এই কনফিগারেশন সম্পূর্ণ ডায়নামিক লিঙ্কার আইসোলেশন প্রদান করে। এটি নিশ্চিত করে যে সিস্টেম পার্টিশনের মডিউলগুলি ভেন্ডর পার্টিশনের শেয়ার করা লাইব্রেরির উপর নির্ভর করবে না এবং এর উল্টোটাও হবে না।
Android 8.1 বা তার পরবর্তী যেকোনও ভার্সনে, VNDK কনফিগারেশন হল ডিফল্ট কনফিগারেশন
এবং BOARD_VNDK_VERSION-এর মান current হিসেবে সেট করে সম্পূর্ণ ডায়নামিক লিঙ্কার আইসোলেশন চালু করার
জন্য অত্যন্ত সাজেস্ট করা হয়।
VNDK কনফিগারেশন
VNDK কনফিগারেশন, সিস্টেম পার্টিশন ও ভেন্ডর পার্টিশনের মধ্যে শেয়ার করা লাইব্রেরির ডিপেন্ডেন্সি আলাদা করে। আগের উপবিভাগে উল্লেখ করা কনফিগারেশনের তুলনায়, পার্থক্যগুলি নিম্নলিখিতভাবে তুলে ধরা হয়েছে:
-
ফ্রেমওয়ার্ক প্রসেস
default,vndk,sphalএবংrsনেমস্পেস তৈরি করা হয়েছে।- সব নেমস্পেস আলাদা করা আছে।
- সিস্টেম শেয়ার করা লাইব্রেরি
defaultনেমস্পেসে লোড করা হয়। - SP-HAL,
sphalনেমস্পেসে লোড করা হয়। - VNDK-SP শেয়ার করা লাইব্রেরি
vndkনেমস্পেসে লোড করা হয়।
-
ভেন্ডর প্রসেস
default,vndkএবংsystemনেমস্পেস তৈরি করা হয়েছে।defaultনেমস্পেস আলাদা করা আছে।- ভেন্ডর শেয়ার করা লাইব্রেরি
defaultনেমস্পেসে লোড করা হয়। - VNDK এবং VNDK-SP শেয়ার করা লাইব্রেরি
vndkনেমস্পেসে লোড করা হয়। - LL-NDK ও এর ডিপেন্ডেন্সি
systemনেমস্পেসে লোড করা হয়।
লিঙ্কার নেমস্পেসের মধ্যে সম্পর্ক নিচে দেখানো হয়েছে।
ছবি ১. লিঙ্কার নেমস্পেস আইসোলেশন (VNDK কনফিগারেশন)।
উপরের ছবিতে, LL-NDK এবং VNDK-SP বলতে নিম্নলিখিত শেয়ার করা লাইব্রেরি বোঝানো হয়েছে:
-
LL-NDK
libEGL.solibGLESv1_CM.solibGLESv2.solibGLESv3.solibandroid_net.solibc.solibdl.soliblog.solibm.solibnativewindow.solibneuralnetworks.solibsync.solibvndksupport.solibvulkan.so
-
VNDK-SP
android.hardware.graphics.common@1.0.soandroid.hardware.graphics.mapper@2.0.soandroid.hardware.renderscript@1.0.soandroid.hidl.memory@1.0.solibRSCpuRef.solibRSDriver.solibRS_internal.solibbase.solibbcinfo.solibc++.solibcutils.solibhardware.solibhidlbase.solibhidlmemory.solibhidltransport.solibhwbinder.solibion.solibutils.solibz.so
আপনি ডিভাইস থেকে /linkerconfig/ld.config.txt-এ আরও বিবরণ দেখতে পাবেন।
VNDK Lite কনফিগারেশন
Android 8.0 থেকে, ডাইনামিক লিঙ্কারকে SP-HAL এবং VNDK-SP শেয়ার করা লাইব্রেরিগুলিকে আলাদা করার জন্য কনফিগার করা হয়েছে যাতে তাদের চিহ্নগুলি অন্যান্য ফ্রেমওয়ার্কের শেয়ার করা লাইব্রেরির সাথে বিরোধ না করে। লিঙ্কার নেমস্পেসের মধ্যে সম্পর্ক নিচে দেখানো হয়েছে।
LL-NDK ও VNDK-SP নিম্নলিখিত শেয়ার করা লাইব্রেরির জন্য ব্যবহৃত হয়:
-
LL-NDK
libEGL.solibGLESv1_CM.solibGLESv2.solibc.solibdl.soliblog.solibm.solibnativewindow.solibstdc++.so(কনফিগারেশনে নেই)libsync.solibvndksupport.solibz.so(কনফিগারেশনে VNDK-SP-তে সরানো হয়েছে)
-
VNDK-SP
android.hardware.graphics.common@1.0.soandroid.hardware.graphics.mapper@2.0.soandroid.hardware.renderscript@1.0.soandroid.hidl.memory@1.0.solibbase.solibc++.solibcutils.solibhardware.solibhidlbase.solibhidlmemory.solibhidltransport.solibhwbinder.solibion.solibutils.so
নিচের সারণীতে ফ্রেমওয়ার্ক
প্রসেসের জন্য নেমস্পেস কনফিগারেশন তালিকাভুক্ত করা আছে, যা VNDK Lite কনফিগারেশনের
[system] বিভাগ থেকে নেওয়া হয়েছে।
| নেমস্পেস | প্রপার্টি | মান |
|---|---|---|
default |
search.paths |
/system/${LIB}/odm/${LIB}/vendor/${LIB}/product/${LIB}
|
isolated |
false |
|
sphal |
search.paths |
/odm/${LIB}/vendor/${LIB}
|
permitted.paths |
/odm/${LIB}/vendor/${LIB}
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk,rs |
|
link.default.shared_libs |
LL-NDK | |
link.vndk.shared_libs |
VNDK-SP | |
link.rs.shared_libs |
libRS_internal.so |
|
vndk (VNDK-SP-এর জন্য) |
search.paths |
/odm/${LIB}/vndk-sp/vendor/${LIB}/vndk-sp/system/${LIB}/vndk-sp-${VER}
|
permitted.paths |
/odm/${LIB}/hw/odm/${LIB}/egl/vendor/${LIB}/hw/vendor/${LIB}/egl/system/${LIB}/vndk-sp-${VER}/hw |
|
isolated |
true |
|
visible |
true |
|
links |
default |
|
link.default.shared_libs |
LL-NDK | |
rs (RenderScript-এর জন্য) |
search.paths |
/odm/${LIB}/vndk-sp/vendor/${LIB}/vndk-sp/system/${LIB}/vndk-sp-${VER}/odm/${LIB}/vendor/${LIB}
|
permitted.paths |
/odm/${LIB}/vendor/${LIB}/data (for compiled RS kernel)
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk |
|
link.default.shared_libs |
LL-NDKlibmediandk.solibft2.so
|
|
link.vndk.shared_libs |
VNDK-SP |
নিচের সারণীতে ভেন্ডর প্রসেসের জন্য নেমস্পেস কনফিগারেশন দেখানো হয়েছে,
যা VNDK Lite কনফিগারেশনের
[vendor] বিভাগ থেকে নেওয়া হয়েছে।
| নেমস্পেস | প্রপার্টি | মান |
|---|---|---|
default |
search.paths |
/odm/${LIB}/odm/${LIB}/vndk/odm/${LIB}/vndk-sp/vendor/${LIB}/vendor/${LIB}/vndk/vendor/${LIB}/vndk-sp/system/${LIB}/vndk-${VER}/system/${LIB}/vndk-sp-${VER}/system/${LIB} (বন্ধ করা হয়েছে)/product/${LIB} (বন্ধ করা হয়েছে)
|
isolated |
false |
ডিভাইস থেকে /linkerconfig/ld.config.txt-এ আরও বিবরণ পাওয়া যাবে।
ডকুমেন্টের ইতিহাস
Android 11-এ পরিবর্তন
- Android 11-এ, স্ট্যাটিক
ld.config.*.txtফাইলগুলি কোডবেস থেকে সরানো হয় এবং LinkerConfig পরিবর্তে রানটাইমে সেগুলি তৈরি করে।
Android 9-এ পরিবর্তন
- Android 9-এ,
vndkলিঙ্কার নেমস্পেস ভেন্ডর প্রসেসে যোগ করা হয় এবং VNDK শেয়ার করা লাইব্রেরি ডিফল্ট লিঙ্কার নেমস্পেস থেকে আলাদা করা হয়। - আরও নির্দিষ্ট
PRODUCT_TREBLE_LINKER_NAMESPACESদিয়েPRODUCT_FULL_TREBLEপরিবর্তন করো। - Android 9 নিম্নলিখিত ডায়নামিক লিঙ্কার কনফিগারেশন
ফাইলের নাম পরিবর্তন করে।
Android 8.x Android 9 বর্ণনা ld.config.txt.inld.config.txtরানটাইম লিঙ্কার নেমস্পেস আইসোলেশন সহ ডিভাইসের জন্য ld.config.txtld.config.vndk_lite.txtVNDK-SP লিঙ্কার নেমস্পেস আইসোলেশন সহ ডিভাইসের জন্য ld.config.legacy.txtld.config.legacy.txtAndroid 7.x বা এর আগের যেকোনও ভার্সন চলছে এমন পুরনো ডিভাইসের জন্য android.hardware.graphics.allocator@2.0.soসরান।productওodmপার্টিশন যোগ করা হয়েছে।