লিঙ্কার নামস্থান

ডাইনামিক লিঙ্কার 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}

কনফিগারেশন ফাইলে অন্তর্ভুক্ত রয়েছে:

  • ডাইনামিক লিঙ্কারের কার্যকর সেকশন নির্বাচন করার জন্য শুরুতে বেশ কয়েকটি ডিরেক্টরি-সেকশন ম্যাপিং প্রোপার্টি থাকে।
  • লিঙ্কার নেমস্পেস কনফিগারেশনের বিভিন্ন অংশ:
    • প্রতিটি বিভাগে একাধিক নেমস্পেস (গ্রাফ ভার্টেক্স) এবং নেমস্পেসগুলোর মধ্যে একাধিক ফলব্যাক লিঙ্ক (গ্রাফ আর্ক) থাকে।
    • প্রতিটি নেমস্পেসের নিজস্ব আইসোলেশন, সার্চ পাথ, অনুমোদিত পাথ এবং ভিজিবিলিটি সেটিংস থাকে।

নিচের সারণিগুলোতে প্রতিটি বৈশিষ্ট্যের অর্থ বিস্তারিতভাবে বর্ণনা করা হয়েছে।

ডিরেক্টরি-বিভাগ ম্যাপিং সম্পত্তি

সম্পত্তি বর্ণনা উদাহরণ

dir. name

এমন একটি ডিরেক্টরির পথ, যেটির ক্ষেত্রে [ name ] অংশটি প্রযোজ্য।

প্রতিটি প্রপার্টি ডিরেক্টরির অধীনে থাকা এক্সিকিউটেবল ফাইলগুলোকে একটি লিঙ্কার নেমস্পেস কনফিগারেশন সেকশনের সাথে ম্যাপ করে। একই name দুই বা ততোধিক প্রপার্টি থাকতে পারে, যেগুলো ভিন্ন ভিন্ন ডিরেক্টরিকে নির্দেশ করে।

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

এর থেকে বোঝা যায় যে, [system] সেকশনে নির্দিষ্ট করা কনফিগারেশনটি /system/bin অথবা /system/xbin থেকে লোড করা এক্সিকিউটেবলগুলোর ক্ষেত্রে প্রযোজ্য।

[vendor] বিভাগে নির্দিষ্ট করা কনফিগারেশনটি /vendor/bin থেকে লোড করা এক্সিকিউটেবলগুলোর ক্ষেত্রে প্রযোজ্য।

সম্পর্কের বৈশিষ্ট্য

সম্পত্তি বর্ণনা উদাহরণ
additional. namespaces

সেকশনটির জন্য ( default নেমস্পেস ছাড়াও) অতিরিক্ত নেমস্পেসগুলোর একটি কমা-দ্বারা-বিভক্ত তালিকা।

additional. namespaces = sphal, vndk

এটি নির্দেশ করে যে [system] কনফিগারেশনে তিনটি নেমস্পেস ( default , sphal , এবং vndk ) রয়েছে।

namespace. name . links

ফলব্যাক নেমস্পেসগুলোর একটি কমা-দ্বারা-বিভক্ত তালিকা।

যদি বর্তমান নেমস্পেসে কোনো শেয়ার্ড লাইব্রেরি খুঁজে না পাওয়া যায়, তাহলে ডাইনামিক লিঙ্কার ফলব্যাক নেমস্পেসগুলো থেকে শেয়ার্ড লাইব্রেরিটি লোড করার চেষ্টা করে। তালিকার শুরুতে নির্দিষ্ট করা নেমস্পেসটির অগ্রাধিকার বেশি থাকে।

namespace. sphal. links = default, vndk

যদি কোনো শেয়ার্ড লাইব্রেরি বা এক্সিকিউটেবল এমন একটি শেয়ার্ড লাইব্রেরির জন্য অনুরোধ করে যা sphal নেমস্পেসে লোড করা যায় না, তাহলে ডাইনামিক লিঙ্কার default নেমস্পেস থেকে শেয়ার্ড লাইব্রেরিটি লোড করার চেষ্টা করে।

এবং তারপর, যদি default নেমস্পেস থেকেও শেয়ার্ড লাইব্রেরিটি লোড করা না যায়, তাহলে ডাইনামিক লিঙ্কার vndk নেমস্পেস থেকে শেয়ার্ড লাইব্রেরিটি লোড করার চেষ্টা করে।

অবশেষে, সমস্ত প্রচেষ্টা ব্যর্থ হলে, ডাইনামিক লিঙ্কার একটি ত্রুটি ফেরত দেয়।

namespace. name . link. other . shared_libs

শেয়ার্ড লাইব্রেরিগুলোর একটি কোলন-বিভক্ত তালিকা, যেগুলো name নেমস্পেসে খুঁজে না পেলে other নেমস্পেসে অনুসন্ধান করা যেতে পারে।

এই প্রপার্টিটি namespace. name . link. other . allow_all_shared_libs সাথে ব্যবহার করা যাবে না।

namespace. sphal. link. default. shared_libs = libc.so: libm.so

এর থেকে বোঝা যায় যে, ফলব্যাক লিঙ্কটি অনুরোধকৃত লাইব্রেরির নাম হিসেবে শুধুমাত্র libc.so বা libm.so গ্রহণ করে। যদি অনুরোধকৃত লাইব্রেরির নাম libc.so বা libm.so না হয়, তাহলে ডাইনামিক লিঙ্কার sphal থেকে default নেমস্পেসের ফলব্যাক লিঙ্কটি উপেক্ষা করে।

namespace. name . link. other . allow_all_shared_libs

একটি বুলিয়ান মান যা নির্দেশ করে যে, name নেমস্পেসে কোনো শেয়ার্ড লাইব্রেরি খুঁজে না পাওয়া গেলে, সেই লাইব্রেরিগুলো other নেমস্পেসে অনুসন্ধান করা যাবে কি না।

এই প্রপার্টিটি namespace. name . link. other . shared_libs এর সাথে ব্যবহার করা যাবে না।

namespace. vndk. link. sphal. allow_all_shared_libs = true

এর থেকে বোঝা যায় যে, সমস্ত লাইব্রেরির নাম vndk থেকে sphal নেমস্পেসে ফলব্যাক লিঙ্কের মাধ্যমে যেতে পারে।

নেমস্পেস বৈশিষ্ট্য

সম্পত্তি বর্ণনা উদাহরণ
namespace. name . isolated

একটি বুলিয়ান মান যা নির্দেশ করে যে ডায়নামিক লিঙ্কার শেয়ার্ড লাইব্রেরিটি কোথায় অবস্থিত তা পরীক্ষা করবে কিনা।

যদি isolated এর true হয়, তবে শুধুমাত্র সেই শেয়ার্ড লাইব্রেরিগুলোই লোড করা যাবে যেগুলো search.paths ডিরেক্টরিগুলোর (সাবডিরেক্টরি ছাড়া) কোনো একটিতে অথবা permitted.paths ডিরেক্টরিগুলোর (সাবডিরেক্টরি সহ) কোনো একটির অধীনে রয়েছে।

যদি isolated এর মান false (ডিফল্ট) হয়, তাহলে ডাইনামিক লিঙ্কার শেয়ার্ড লাইব্রেরিগুলোর পাথ পরীক্ষা করে না।

namespace. sphal. isolated = true

এর থেকে বোঝা যায় যে, শুধুমাত্র search.paths অথবা permitted.paths এ থাকা শেয়ার্ড লাইব্রেরিগুলোই sphal নেমস্পেসে লোড করা যাবে।

namespace. name . search.paths

শেয়ার্ড লাইব্রেরিগুলো খোঁজার জন্য ডিরেক্টরিগুলোর একটি কোলন-বিভক্ত তালিকা।

যদি dlopen() ফাংশন কল বা DT_NEEDED এন্ট্রিতে সম্পূর্ণ পাথ উল্লেখ না করা হয়, তাহলে search.paths এ নির্দিষ্ট করা ডিরেক্টরিগুলো অনুরোধ করা লাইব্রেরির নামের শুরুতে যুক্ত করা হয়। তালিকার শুরুতে নির্দিষ্ট করা ডিরেক্টরিটির অগ্রাধিকার বেশি।

যখন isolated এর true হয়, তখন search.paths ডিরেক্টরিগুলোর (সাবডিরেক্টরি বাদে) কোনো একটিতে থাকা শেয়ার্ড লাইব্রেরিগুলো permitted.paths প্রপার্টির ওপর নির্ভর না করেই লোড করা যায়।

উদাহরণস্বরূপ, যদি search.paths /system/${LIB} হয় এবং permitted.paths খালি থাকে, তাহলে /system/${LIB}/libc.so লোড করা গেলেও /system/${LIB}/vndk/libutils.so লোড করা যাবে না।

namespace. default. search.paths = /system/${LIB}

এর থেকে বোঝা যায় যে ডাইনামিক লিঙ্কার শেয়ার্ড লাইব্রেরির জন্য /system/${LIB} এ অনুসন্ধান করে।

namespace. name . asan.search.paths

AddressSanitizer (ASan) সক্রিয় থাকলে শেয়ার্ড লাইব্রেরি খোঁজার জন্য ডিরেক্টরিগুলোর একটি কোলন-বিভক্ত তালিকা।

ASan সক্রিয় থাকলে namespace. name . search.paths উপেক্ষা করা হয়।

namespace. default. asan.search.paths = /data/asan/system/${LIB}: /system/${LIB}

এর থেকে বোঝা যায় যে, যখন ASan সক্রিয় করা হয়, তখন ডাইনামিক লিঙ্কার প্রথমে /data/asan/system/${LIB} এবং তারপর /system/${LIB} অনুসন্ধান করে।

namespace. name . permitted.paths

কোলন দ্বারা পৃথক করা ডিরেক্টরিগুলোর (সাবডিরেক্টরি সহ) একটি তালিকা, যেখান থেকে ডাইনামিক লিঙ্কার শেয়ার্ড লাইব্রেরিগুলো লোড করতে পারে ( search.paths ছাড়াও), যখন isolated true হয়।

permitted.paths এর সাবডিরেক্টরিগুলোর অধীনে থাকা শেয়ার্ড লাইব্রেরিগুলোও লোড করা যেতে পারে। উদাহরণস্বরূপ, যদি permitted.paths হয় /system/${LIB} , তাহলে /system/${LIB}/libc.so এবং /system/${LIB}/vndk/libutils.so উভয়ই লোড করা যাবে।

যদি isolated এর মান false হয়, তাহলে permitted.paths উপেক্ষা করা হয় এবং একটি সতর্কবার্তা প্রদর্শিত হয়।

namespace. default. permitted.paths = /system/${LIB}/hw

এর থেকে বোঝা যায় যে /system/${LIB}/hw এর অধীনে থাকা শেয়ার্ড লাইব্রেরিগুলো আইসোলেটেড default নেমস্পেসে লোড করা যেতে পারে।

উদাহরণস্বরূপ, permitted.paths ছাড়া, libaudiohal.so default নেমস্পেসে /system/${LIB}/hw/audio.a2dp.default.so লোড করতে পারে না।

namespace. name . asan.permitted.paths

কোলন দ্বারা পৃথক করা ডিরেক্টরিগুলোর একটি তালিকা, যেখান থেকে ASan সক্রিয় থাকলে ডায়নামিক লিঙ্কার শেয়ার্ড লাইব্রেরিগুলো লোড করতে পারে।

ASan সক্রিয় থাকলে namespace. name . permitted.paths উপেক্ষা করা হয়।

namespace. default. asan.permitted.paths = /data/asan/system/${LIB}/hw: /system/${LIB}/hw

এর থেকে বোঝা যায় যে, ASan সক্রিয় করা থাকলে /data/asan/system/${LIB}/hw অথবা /system/${LIB}/hw এর অধীনে থাকা শেয়ার্ড লাইব্রেরিগুলো আইসোলেটেড default নেমস্পেসে লোড করা যায়।

namespace. name . visible

একটি বুলিয়ান মান যা নির্দেশ করে যে প্রোগ্রামটি ( libc ব্যতীত) android_get_exported_namespace() ব্যবহার করে একটি লিঙ্কার নেমস্পেস হ্যান্ডেল পেতে পারে কিনা এবং সেই হ্যান্ডেলটি android_dlopen_ext() -এ পাস করে লিঙ্কার নেমস্পেসে একটি শেয়ার্ড লাইব্রেরি খুলতে পারে কিনা।

visible true হলে, নেমস্পেসটি বিদ্যমান থাকলে android_get_exported_namespace() সর্বদা handle-টি রিটার্ন করে।

যদি visible false (ডিফল্ট) হয়, তাহলে নেমস্পেসটির উপস্থিতি নির্বিশেষে android_get_exported_namespace() সর্বদা NULL রিটার্ন করে। শেয়ার্ড লাইব্রেরিগুলো এই নেমস্পেসে কেবল তখনই লোড করা যাবে, যদি (১) অন্য কোনো লিঙ্কার নেমস্পেস, যার এই নেমস্পেসের সাথে একটি ফলব্যাক লিঙ্ক আছে, সেটি দ্বারা অনুরোধ করা হয়, অথবা (২) এই নেমস্পেসের অন্য শেয়ার্ড লাইব্রেরি বা এক্সিকিউটেবল দ্বারা অনুরোধ করা হয়।

namespace. sphal. visible = true

এর থেকে বোঝা যায় যে android_get_exported_namespace("sphal") একটি বৈধ লিঙ্কার নেমস্পেস হ্যান্ডেল ফেরত দিতে পারে।

লিঙ্কার নেমস্পেস তৈরি

অ্যান্ড্রয়েড ১১-এ, ${android-src}/system/core/rootdir/etc তে থাকা সাধারণ টেক্সট ফাইলের পরিবর্তে, লিঙ্কার কনফিগারেশন রানটাইমে /linkerconfig অধীনে তৈরি করা হয়। এই কনফিগারেশনটি রানটাইম এনভায়রনমেন্টের উপর ভিত্তি করে বুট টাইমে তৈরি হয়, যার মধ্যে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকে:

  • যদি ডিভাইসটি 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
নির্বাচিত কনফিগারেশন ভিটিএস প্রয়োজনীয়তা
true current VNDK অ্যান্ড্রয়েড ৯ বা তার উচ্চতর সংস্করণে চালু হওয়া ডিভাইসগুলির জন্য বাধ্যতামূলক।
খালি 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 শেয়ার্ড লাইব্রেরিগুলোকেও পৃথক করে। এছাড়াও, এই কনফিগারেশন সম্পূর্ণ ডাইনামিক লিঙ্কার আইসোলেশন প্রদান করে। এটি নিশ্চিত করে যে সিস্টেম পার্টিশনের মডিউলগুলো ভেন্ডর পার্টিশনের শেয়ার্ড লাইব্রেরির উপর নির্ভরশীল হবে না এবং এর বিপরীতটিও ঘটবে না।

অ্যান্ড্রয়েড ৮.১ বা তার উচ্চতর সংস্করণে, 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 কনফিগারেশনে বর্ণিত লিঙ্কার নেমস্পেস গ্রাফ

চিত্র ১. লিঙ্কার নেমস্পেস পৃথকীকরণ (VNDK কনফিগারেশন)।

উপরের ছবিতে, LL-NDK এবং VNDK-SP বলতে নিম্নলিখিত শেয়ার্ড লাইব্রেরিগুলোকে বোঝানো হয়েছে:

  • এলএল-এনডিকে
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libGLESv3.so
    • libandroid_net.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libneuralnetworks.so
    • libsync.so
    • libvndksupport.so
    • libvulkan.so
  • VNDK-SP
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libRSCpuRef.so
    • libRSDriver.so
    • libRS_internal.so
    • libbase.so
    • libbcinfo.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so
    • libz.so

আপনি ডিভাইসের /linkerconfig/ld.config.txt ফাইল থেকে আরও বিস্তারিত তথ্য পেতে পারেন।

VNDK Lite কনফিগারেশন

অ্যান্ড্রয়েড ৮.০ থেকে, ডাইনামিক লিঙ্কারকে SP-HAL এবং VNDK-SP শেয়ার্ড লাইব্রেরিগুলোকে এমনভাবে কনফিগার করা হয়েছে যাতে তাদের সিম্বলগুলো অন্যান্য ফ্রেমওয়ার্ক শেয়ার্ড লাইব্রেরির সাথে সাংঘর্ষিক না হয়। লিঙ্কার নেমস্পেসগুলোর মধ্যকার সম্পর্ক নিচে দেখানো হলো।

VNDK Lite কনফিগারেশনে বর্ণিত লিঙ্কার নেমস্পেস গ্রাফ
চিত্র ২. লিঙ্কার নেমস্পেস পৃথকীকরণ (VNDK Lite কনফিগারেশন)

LL-NDK এবং VNDK-SP বলতে নিম্নলিখিত শেয়ার্ড লাইব্রেরিগুলোকে বোঝায়:

  • এলএল-এনডিকে
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (কনফিগারেশনে নেই)
    • libsync.so
    • libvndksupport.so
    • libz.so (কনফিগারেশনে VNDK-SP- তে স্থানান্তরিত করা হয়েছে)
  • VNDK-SP
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libbase.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.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 এলএল-এনডিকে
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 এলএল-এনডিকে
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 (কম্পাইল করা আরএস কার্নেলের জন্য)
isolated true
visible true
links default,vndk
link.default.shared_libs এলএল-এনডিকে
libmediandk.so
libft2.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 ফাইল থেকে আরও বিস্তারিত তথ্য পাওয়া যাবে।

নথির ইতিহাস

অ্যান্ড্রয়েড ১১ পরিবর্তন

  • অ্যান্ড্রয়েড ১১-এ, স্ট্যাটিক ld.config.*.txt ফাইলগুলো কোডবেস থেকে সরিয়ে দেওয়া হয়েছে এবং এর পরিবর্তে লিঙ্কারকনফিগ রানটাইমে সেগুলো তৈরি করে।

অ্যান্ড্রয়েড ৯ পরিবর্তন

  • অ্যান্ড্রয়েড ৯-এ, vndk লিঙ্কার নেমস্পেসটি ভেন্ডর প্রসেসগুলিতে যুক্ত করা হয়েছে এবং VNDK শেয়ার্ড লাইব্রেরিগুলিকে ডিফল্ট লিঙ্কার নেমস্পেস থেকে পৃথক করা হয়েছে।
  • PRODUCT_FULL_TREBLE আরও সুনির্দিষ্ট PRODUCT_TREBLE_LINKER_NAMESPACES দ্বারা প্রতিস্থাপন করুন।
  • অ্যান্ড্রয়েড ৯ নিম্নলিখিত ডাইনামিক লিঙ্কার কনফিগারেশন ফাইলগুলোর নাম পরিবর্তন করে।
    অ্যান্ড্রয়েড ৮.x অ্যান্ড্রয়েড ৯ বর্ণনা
    ld.config.txt.in ld.config.txt রানটাইম লিঙ্কার নেমস্পেস আইসোলেশন সহ ডিভাইসগুলির জন্য
    ld.config.txt ld.config.vndk_lite.txt VNDK-SP লিঙ্কার নেমস্পেস আইসোলেশন সহ ডিভাইসগুলির জন্য
    ld.config.legacy.txt ld.config.legacy.txt অ্যান্ড্রয়েড ৭.x বা তার নিম্ন সংস্করণে চালিত পুরোনো ডিভাইসগুলির জন্য
  • android.hardware.graphics.allocator@2.0.so মুছে ফেলুন।
  • product এবং odm পার্টিশন যোগ করা হয়েছে।