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

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

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

এই প্রপার্টি 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

একটি বুলিয়ান ভ্যালু যা নির্দেশ করে যে সমস্ত শেয়ার করা লাইব্রেরি other নেমস্পেসে সার্চ করা যাবে কিনা যখন সেই লাইব্রেরিগুলি name নেমস্পেসে খুঁজে পাওয়া যাবে না।

এই প্রপার্টিটি 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

শেয়ার করা লাইব্রেরি সার্চ করার জন্য কোলন দিয়ে আলাদা করা ডিরেক্টরির তালিকা।

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

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

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

এছাড়াও, 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, /system/${LIB}/hw/audio.a2dp.default.so-কে default নেমস্পেসে লোড করতে পারবে না।

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() সবসময় হ্যান্ডেল রিটার্ন করে।

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

namespace.sphal.visible = true

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

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

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 কনফিগারেশনে বর্ণিত লিঙ্কার নেমস্পেস গ্রাফ

ছবি ১. লিঙ্কার নেমস্পেস আইসোলেশন (VNDK কনফিগারেশন)।

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

  • LL-NDK
    • 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 কনফিগারেশন

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

VNDK Lite কনফিগারেশনে বর্ণিত লিঙ্কার নেমস্পেস গ্রাফ
ছবি ২. লিঙ্কার নেমস্পেস আইসোলেশন (VNDK Lite কনফিগারেশন)

LL-NDK ও VNDK-SP নিম্নলিখিত শেয়ার করা লাইব্রেরির জন্য ব্যবহৃত হয়:

  • LL-NDK
    • 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 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-NDK
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-এ আরও বিবরণ পাওয়া যাবে।

ডকুমেন্টের ইতিহাস

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.in ld.config.txt রানটাইম লিঙ্কার নেমস্পেস আইসোলেশন সহ ডিভাইসের জন্য
    ld.config.txt ld.config.vndk_lite.txt VNDK-SP লিঙ্কার নেমস্পেস আইসোলেশন সহ ডিভাইসের জন্য
    ld.config.legacy.txt ld.config.legacy.txt Android 7.x বা এর আগের যেকোনও ভার্সন চলছে এমন পুরনো ডিভাইসের জন্য
  • android.hardware.graphics.allocator@2.0.so সরান।
  • product ও odm পার্টিশন যোগ করা হয়েছে।