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

ডাইনামিক লিঙ্কার ট্রেবল ভিএনডিকে ডিজাইনে দুটি চ্যালেঞ্জ মোকাবেলা করে:

  • 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 ৷ paths ডিরেক্টরিগুলির একটির অধীনে রয়েছে (সাবডিরেক্টরিগুলি সহ) লোড করা যেতে পারে৷

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

namespace. sphal. isolated = true

এটি ইঙ্গিত করে যে search.paths অথবা under permitted.paths এ শুধুমাত্র শেয়ার করা লাইব্রেরিগুলিকে sphal namespace-এ লোড করা যেতে পারে।

namespace. name . search.paths

শেয়ার্ড লাইব্রেরি অনুসন্ধান করার জন্য ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন তালিকা।

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

যখন isolated true হয়, শেয়ার করা লাইব্রেরিগুলি যেগুলি search.paths ডিরেক্টরিগুলির একটিতে থাকে (সাবডিরেক্টরিগুলি ব্যতীত) permitted.paths .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

অ্যাড্রেস স্যানিটাইজার (ASan) সক্রিয় থাকলে শেয়ার্ড লাইব্রেরি অনুসন্ধান করার জন্য ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন তালিকা।

namespace. name . search.paths 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 সক্রিয় থাকে।

namespace. name . permitted.paths 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 প্রদান করে। শেয়ার্ড লাইব্রেরিগুলি শুধুমাত্র এই নেমস্পেসে লোড করা যেতে পারে যদি (1) এই নেমস্পেসে একটি ফলব্যাক লিঙ্ক আছে এমন অন্য লিঙ্কার নেমস্পেস দ্বারা অনুরোধ করা হয়, অথবা (2) এই নেমস্পেসে অন্যান্য শেয়ার্ড লাইব্রেরি বা এক্সিকিউটেবল দ্বারা অনুরোধ করা হয়৷

namespace. sphal. visible = true

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

লিঙ্কার নামস্থান সৃষ্টি

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

  • যদি ডিভাইস VNDK সমর্থন করে
  • বিক্রেতা পার্টিশনের লক্ষ্য VNDK সংস্করণ
  • পণ্য পার্টিশনের VNDK সংস্করণ
  • APEX মডিউল ইনস্টল করা হয়েছে

লিঙ্কার কনফিগারেশন লিঙ্কার নেমস্পেসগুলির মধ্যে নির্ভরতা সমাধান করে তৈরি করা হয়। উদাহরণস্বরূপ, যদি APEX মডিউলগুলিতে কোনো আপডেট থাকে যাতে নির্ভরতা আপডেট অন্তর্ভুক্ত থাকে, তাহলে লিঙ্কার কনফিগারেশন এই পরিবর্তনগুলিকে প্রতিফলিত করে তৈরি করা হয়। লিঙ্কার কনফিগারেশন তৈরি করার জন্য আরও বিশদ ${android-src}/system/linkerconfig এ পাওয়া যাবে।

লিঙ্কার নামস্থান বিচ্ছিন্নতা

তিন ধরনের কনফিগারেশন আছে। BoardConfig.mkPRODUCT_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 ভাগ করা লাইব্রেরিগুলিকেও আলাদা করে। উপরন্তু, এই কনফিগারেশন সম্পূর্ণ গতিশীল লিঙ্কার বিচ্ছিন্নতা প্রদান করে। এটি নিশ্চিত করে যে সিস্টেম পার্টিশনের মডিউলগুলি বিক্রেতা পার্টিশনে ভাগ করা লাইব্রেরির উপর নির্ভর করবে না এবং এর বিপরীতে।

অ্যান্ড্রয়েড 8.1 বা উচ্চতর সংস্করণে, VNDK কনফিগারেশন হল ডিফল্ট কনফিগারেশন এবং BOARD_VNDK_VERSION current সেট করে সম্পূর্ণ ডাইনামিক লিঙ্কার আইসোলেশন সক্ষম করার জন্য এটি অত্যন্ত সুপারিশ করা হয়।

VNDK কনফিগারেশন

VNDK কনফিগারেশন সিস্টেম পার্টিশন এবং বিক্রেতা পার্টিশনের মধ্যে ভাগ করা লাইব্রেরি নির্ভরতাকে আলাদা করে। পূর্ববর্তী উপধারায় উল্লিখিত কনফিগারেশনের তুলনায়, পার্থক্যগুলি নিম্নরূপ বর্ণিত হয়েছে:

  • ফ্রেমওয়ার্ক প্রক্রিয়া

    • default , vndk , sphal , এবং rs নামস্থান তৈরি করা হয়।
    • সমস্ত নামস্থান বিচ্ছিন্ন।
    • সিস্টেম ভাগ করা লাইব্রেরি default নামস্থানে লোড করা হয়।
    • SP-HALs sphal নামস্থানে লোড করা হয়।
    • VNDK-SP ভাগ করা লাইব্রেরিগুলি vndk নামস্থানে লোড করা হয়েছে।
  • বিক্রেতা প্রক্রিয়া

    • default , vndk এবং system নামস্থান তৈরি করা হয়।
    • default নামস্থান বিচ্ছিন্ন।
    • বিক্রেতার ভাগ করা লাইব্রেরিগুলি default নামস্থানে লোড করা হয়৷
    • VNDK এবং VNDK-SP ভাগ করা লাইব্রেরিগুলি vndk নামস্থানে লোড করা হয়।
    • LL-NDK এবং এর নির্ভরতাগুলি system নামস্থানে লোড করা হয়।

লিঙ্কার নামস্থানের মধ্যে সম্পর্ক নীচে চিত্রিত করা হয়েছে।

VNDK কনফিগারেশনে বর্ণিত লিঙ্কার নেমস্পেস গ্রাফ

চিত্র 1. লিঙ্কার নেমস্পেস বিচ্ছিন্নতা (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
  • ভিএনডিকে-এসপি
    • 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 লাইট কনফিগারেশন

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

ভিএনডিকে লাইট কনফিগারেশনে বর্ণিত লিঙ্কার নেমস্পেস গ্রাফ
চিত্র 2. লিঙ্কার নেমস্পেস বিচ্ছিন্নতা (ভিএনডিকে লাইট কনফিগারেশন)

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 (কনফিগারেশনে ভিএনডিকে-এসপিতে সরানো হয়েছে)
  • ভিএনডিকে-এসপি
    • 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 লাইট কনফিগারেশনের [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 ভিএনডিকে-এসপি
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 (রেন্ডারস্ক্রিপ্টের জন্য) 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 লাইট কনফিগারেশনের [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 এ আরও বিশদ বিবরণ পাওয়া যাবে।

নথির ইতিহাস

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

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

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

  • অ্যান্ড্রয়েড 9-এ, vndk লিঙ্কার নামস্থান বিক্রেতা প্রক্রিয়াগুলিতে যোগ করা হয় এবং VNDK ভাগ করা লাইব্রেরিগুলি ডিফল্ট লিঙ্কার নামস্থান থেকে বিচ্ছিন্ন করা হয়।
  • PRODUCT_FULL_TREBLE আরও নির্দিষ্ট PRODUCT_TREBLE_LINKER_NAMESPACES দিয়ে প্রতিস্থাপন করুন।
  • Android 9 নিম্নলিখিত ডায়নামিক লিঙ্কার কনফিগারেশন ফাইলগুলির নাম পরিবর্তন করে।
    Android 8.x অ্যান্ড্রয়েড 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 অ্যান্ড্রয়েড 7.x বা তার কম সংস্করণে চলমান লিগ্যাসি ডিভাইসগুলির জন্য
  • android.hardware.graphics.allocator@2.0.so সরান।
  • product এবং odm পার্টিশন যোগ করা হয়.
,

ডাইনামিক লিঙ্কার ট্রেবল ভিএনডিকে ডিজাইনে দুটি চ্যালেঞ্জ মোকাবেলা করে:

  • 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 ৷ paths ডিরেক্টরিগুলির একটির অধীনে রয়েছে (সাবডিরেক্টরিগুলি সহ) লোড করা যেতে পারে৷

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

namespace. sphal. isolated = true

এটি ইঙ্গিত করে যে search.paths অথবা under permitted.paths এ শুধুমাত্র শেয়ার করা লাইব্রেরিগুলিকে sphal namespace-এ লোড করা যেতে পারে।

namespace. name . search.paths

শেয়ার্ড লাইব্রেরি অনুসন্ধান করার জন্য ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন তালিকা।

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

যখন isolated true হয়, শেয়ার করা লাইব্রেরিগুলি যেগুলি search.paths ডিরেক্টরিগুলির একটিতে থাকে (সাবডিরেক্টরিগুলি ব্যতীত) permitted.paths .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

অ্যাড্রেস স্যানিটাইজার (ASan) সক্রিয় থাকলে শেয়ার্ড লাইব্রেরি অনুসন্ধান করার জন্য ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন তালিকা।

namespace. name . search.paths 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 সক্রিয় থাকে।

namespace. name . permitted.paths 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 প্রদান করে। শেয়ার্ড লাইব্রেরিগুলি শুধুমাত্র এই নেমস্পেসে লোড করা যেতে পারে যদি (1) এই নেমস্পেসে একটি ফলব্যাক লিঙ্ক আছে এমন অন্য লিঙ্কার নেমস্পেস দ্বারা অনুরোধ করা হয়, অথবা (2) এই নেমস্পেসে অন্যান্য শেয়ার্ড লাইব্রেরি বা এক্সিকিউটেবল দ্বারা অনুরোধ করা হয়৷

namespace. sphal. visible = true

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

লিঙ্কার নামস্থান সৃষ্টি

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

  • যদি ডিভাইস VNDK সমর্থন করে
  • বিক্রেতা পার্টিশনের লক্ষ্য VNDK সংস্করণ
  • পণ্য পার্টিশনের VNDK সংস্করণ
  • APEX মডিউল ইনস্টল করা হয়েছে

লিঙ্কার কনফিগারেশন লিঙ্কার নেমস্পেসগুলির মধ্যে নির্ভরতা সমাধান করে তৈরি করা হয়। উদাহরণস্বরূপ, যদি APEX মডিউলগুলিতে কোনো আপডেট থাকে যাতে নির্ভরতা আপডেট অন্তর্ভুক্ত থাকে, তাহলে লিঙ্কার কনফিগারেশন এই পরিবর্তনগুলিকে প্রতিফলিত করে তৈরি করা হয়। লিঙ্কার কনফিগারেশন তৈরি করার জন্য আরও বিশদ ${android-src}/system/linkerconfig এ পাওয়া যাবে।

লিঙ্কার নামস্থান বিচ্ছিন্নতা

তিন ধরনের কনফিগারেশন আছে। BoardConfig.mkPRODUCT_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 ভাগ করা লাইব্রেরিগুলিকেও আলাদা করে। উপরন্তু, এই কনফিগারেশন সম্পূর্ণ গতিশীল লিঙ্কার বিচ্ছিন্নতা প্রদান করে। এটি নিশ্চিত করে যে সিস্টেম পার্টিশনের মডিউলগুলি বিক্রেতা পার্টিশনে ভাগ করা লাইব্রেরির উপর নির্ভর করবে না এবং এর বিপরীতে।

অ্যান্ড্রয়েড 8.1 বা উচ্চতর সংস্করণে, VNDK কনফিগারেশন হল ডিফল্ট কনফিগারেশন এবং BOARD_VNDK_VERSION current সেট করে সম্পূর্ণ ডাইনামিক লিঙ্কার আইসোলেশন সক্ষম করার জন্য এটি অত্যন্ত সুপারিশ করা হয়।

VNDK কনফিগারেশন

VNDK কনফিগারেশন সিস্টেম পার্টিশন এবং বিক্রেতা পার্টিশনের মধ্যে ভাগ করা লাইব্রেরি নির্ভরতাকে আলাদা করে। পূর্ববর্তী উপধারায় উল্লিখিত কনফিগারেশনের তুলনায়, পার্থক্যগুলি নিম্নরূপ বর্ণিত হয়েছে:

  • ফ্রেমওয়ার্ক প্রক্রিয়া

    • default , vndk , sphal , এবং rs নামস্থান তৈরি করা হয়।
    • সমস্ত নামস্থান বিচ্ছিন্ন।
    • সিস্টেম ভাগ করা লাইব্রেরি default নামস্থানে লোড করা হয়।
    • SP-HALs sphal নামস্থানে লোড করা হয়।
    • VNDK-SP ভাগ করা লাইব্রেরিগুলি vndk নামস্থানে লোড করা হয়েছে।
  • বিক্রেতা প্রক্রিয়া

    • default , vndk এবং system নামস্থান তৈরি করা হয়।
    • default নামস্থান বিচ্ছিন্ন।
    • বিক্রেতার ভাগ করা লাইব্রেরিগুলি default নামস্থানে লোড করা হয়৷
    • VNDK এবং VNDK-SP ভাগ করা লাইব্রেরিগুলি vndk নামস্থানে লোড করা হয়।
    • LL-NDK এবং এর নির্ভরতাগুলি system নামস্থানে লোড করা হয়।

লিঙ্কার নামস্থানের মধ্যে সম্পর্ক নীচে চিত্রিত করা হয়েছে।

VNDK কনফিগারেশনে বর্ণিত লিঙ্কার নেমস্পেস গ্রাফ

চিত্র 1. লিঙ্কার নেমস্পেস বিচ্ছিন্নতা (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
  • ভিএনডিকে-এসপি
    • 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 লাইট কনফিগারেশন

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

ভিএনডিকে লাইট কনফিগারেশনে বর্ণিত লিঙ্কার নেমস্পেস গ্রাফ
চিত্র 2. লিঙ্কার নেমস্পেস বিচ্ছিন্নতা (ভিএনডিকে লাইট কনফিগারেশন)

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 (কনফিগারেশনে ভিএনডিকে-এসপিতে সরানো হয়েছে)
  • ভিএনডিকে-এসপি
    • 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 লাইট কনফিগারেশনের [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 ভিএনডিকে-এসপি
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 (রেন্ডারস্ক্রিপ্টের জন্য) 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 লাইট কনফিগারেশনের [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 এ আরও বিশদ বিবরণ পাওয়া যাবে।

নথির ইতিহাস

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

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

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

  • অ্যান্ড্রয়েড 9-এ, vndk লিঙ্কার নামস্থান বিক্রেতা প্রক্রিয়াগুলিতে যোগ করা হয় এবং VNDK ভাগ করা লাইব্রেরিগুলি ডিফল্ট লিঙ্কার নামস্থান থেকে বিচ্ছিন্ন করা হয়।
  • PRODUCT_FULL_TREBLE আরও নির্দিষ্ট PRODUCT_TREBLE_LINKER_NAMESPACES দিয়ে প্রতিস্থাপন করুন।
  • Android 9 নিম্নলিখিত ডায়নামিক লিঙ্কার কনফিগারেশন ফাইলগুলির নাম পরিবর্তন করে।
    Android 8.x অ্যান্ড্রয়েড 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 অ্যান্ড্রয়েড 7.x বা তার কম সংস্করণে চলমান লিগ্যাসি ডিভাইসগুলির জন্য
  • android.hardware.graphics.allocator@2.0.so সরান।
  • product এবং odm পার্টিশন যোগ করা হয়.
,

ডাইনামিক লিঙ্কার ট্রেবল ভিএনডিকে ডিজাইনে দুটি চ্যালেঞ্জ মোকাবেলা করে:

  • SP-HAL শেয়ার্ড লাইব্রেরি এবং VNDK-SP লাইব্রেরি সহ তাদের নির্ভরতা ফ্রেমওয়ার্ক প্রসেসে লোড করা হয়। প্রতীক দ্বন্দ্ব প্রতিরোধে কিছু ব্যবস্থা থাকা উচিত।
  • dlopen() এবং android_dlopen_ext() কিছু রানটাইম নির্ভরতা প্রবর্তন করতে পারে যা নির্মাণের সময় দৃশ্যমান হয় না এবং স্ট্যাটিক বিশ্লেষণ ব্যবহার করে সনাক্ত করা কঠিন হতে পারে।

এই দুটি চ্যালেঞ্জ লিঙ্কার নেমস্পেস মেকানিজম দ্বারা সমাধান করা যেতে পারে। এই প্রক্রিয়াটি ডায়নামিক লিঙ্কার দ্বারা সরবরাহ করা হয়। এটি বিভিন্ন লিঙ্কার নামস্থানে ভাগ করা লাইব্রেরিগুলিকে বিচ্ছিন্ন করতে পারে যাতে একই লাইব্রেরি নামের লাইব্রেরিগুলি কিন্তু ভিন্ন চিহ্নগুলির সাথে বিরোধ না করে।

অন্যদিকে, লিঙ্কার নেমস্পেস মেকানিজম নমনীয়তা প্রদান করে যাতে কিছু শেয়ার করা লাইব্রেরি একটি লিঙ্কার নেমস্পেস দ্বারা রপ্তানি করা যায় এবং অন্য লিঙ্কার নেমস্পেস দ্বারা ব্যবহার করা যায়। এই রফতানি করা ভাগ করা গ্রন্থাগারগুলি তাদের লিঙ্কার নেমস্পেসগুলির মধ্যে প্রয়োগের বিশদটি গোপন করার সময় অন্যান্য প্রোগ্রামগুলিতে সর্বজনীন অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেসে পরিণত হতে পারে।

উদাহরণস্বরূপ, /system/lib[64]/libcutils.so /system/lib[64]/vndk-sp-${VER}/libcutils.so লিবিল 64 64 এই দুটি লাইব্রেরিতে বিভিন্ন চিহ্ন থাকতে পারে। এগুলি বিভিন্ন লিঙ্কার নেমস্পেসে লোড করা হয়েছে যাতে ফ্রেমওয়ার্ক মডিউলগুলি /system/lib[64]/libcutils.so লিবিল 6464/libcutils.so এবং এসপি-এইচএল শেয়ার্ড লাইব্রেরিগুলি নির্ভর করতে পারে /system/lib[64]/vndk-sp-${VER}/libcutils.so লিবিল 6464//vndk-p-very/libcutils.so এর উপর নির্ভর করতে পারে।

অন্যদিকে, /system/lib[64]/libc.so লিবিল 6464/libc.so একটি পাবলিক লাইব্রেরির একটি উদাহরণ যা একটি লিঙ্কার নেমস্পেস দ্বারা রফতানি করা হয় এবং অনেকগুলি লিঙ্কার নেমস্পেসে আমদানি করা হয়। /system/lib[64]/libc.so লিবিল 6464/libc.so এর নির্ভরতাগুলি যেমন libnetd_client.so , নামস্পেসে লোড করা হয় যেখানে /system/lib[64]/libc.so লিবিল 6464/libc.so থাকে। অন্যান্য নেমস্পেসে সেই নির্ভরতাগুলিতে অ্যাক্সেস থাকবে না। এই প্রক্রিয়াটি পাবলিক ইন্টারফেস সরবরাহ করার সময় বাস্তবায়নের বিশদগুলিকে আবদ্ধ করে।

এটা কিভাবে কাজ করে

ডায়নামিক লিঙ্কারটি DT_NEEDED এন্ট্রিগুলিতে নির্দিষ্ট ভাগ করা লাইব্রেরি বা dlopen() বা android_dlopen_ext() এর যুক্তি দ্বারা নির্দিষ্ট করা ভাগ করা লাইব্রেরিগুলিতে লোড করার জন্য দায়বদ্ধ। উভয় ক্ষেত্রেই, ডায়নামিক লিঙ্কার লিঙ্কার নেমস্পেসটি সন্ধান করে যেখানে কলার বাস করে এবং একই লিঙ্কার নেমস্পেসে নির্ভরতাগুলি লোড করার চেষ্টা করে। যদি ডায়নামিক লিঙ্কার ভাগ করা লাইব্রেরিটি নির্দিষ্ট লিঙ্কার নেমস্পেসে লোড করতে না পারে তবে এটি রফতানি করা ভাগ করা লাইব্রেরিগুলির জন্য লিঙ্কযুক্ত লিঙ্কার নেমস্পেস জিজ্ঞাসা করে।

কনফিগারেশন ফাইল ফর্ম্যাট

কনফিগারেশন ফাইল ফর্ম্যাটটি আইএনআই ফাইল ফর্ম্যাটের উপর ভিত্তি করে। একটি সাধারণ কনফিগারেশন ফাইলটি দেখতে এটির মতো:

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 অনুরোধ করা লাইব্রেরির নাম হিসাবে গ্রহণ করে। গতিশীল লিঙ্কার sphal থেকে default নেমস্পেসে ফ্যালব্যাক লিঙ্কটিকে উপেক্ষা করে যদি অনুরোধ করা লাইব্রেরির নামটি libc.so বা libm.so না হয়।

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 permitted.paths , ভাগ করা লাইব্রেরিগুলি যা search.paths একটিতে রয়েছে Pa

উদাহরণস্বরূপ, যদি search.paths /system/${LIB} /system/${LIB}/libc.so permitted.paths /system/${LIB}/vndk/libutils.so

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

এটি নির্দেশ করে যে গতিশীল লিঙ্কার অনুসন্ধান /system/${LIB} ভাগ করা গ্রন্থাগারগুলির জন্য।

namespace. name . asan.search.paths

যখন অ্যাড্রেসসানিটাইজার (এএসএএন) সক্ষম করা হয় তখন ভাগ করা লাইব্রেরিগুলি অনুসন্ধানের জন্য ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন তালিকা।

namespace. name . search.paths Asan সক্ষম করা হলে namespace. name . search.paths উপেক্ষা করা হয়।

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

এটি ইঙ্গিত করে যে যখন আসান সক্ষম করা হয় তখন ডায়নামিক লিঙ্কার অনুসন্ধান /data/asan/system/${LIB} প্রথমে এবং তারপরে অনুসন্ধান /system/${LIB}

namespace. name . permitted.paths

ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন তালিকা (সাব-ডিরেক্টরিগুলি সহ) যেখানে গতিশীল লিঙ্কার ভাগ করা লাইব্রেরিগুলি ( search.paths ছাড়াও) লোড করতে পারে যখন isolated true হয়।

অনুমোদিত লাইব্রেরিগুলি যা permitted.paths উপ -ডিরেক্টরিগুলির অধীনে রয়েছে সেগুলিও লোড করা যেতে পারে। /system/${LIB}/vndk/libutils.so , যদি permitted.paths /system/${LIB}/libc.so /system/${LIB}

যদি isolated false হয় তবে permitted.paths

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

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

উদাহরণস্বরূপ /system/${LIB}/hw/audio.a2dp.default.so permitted.paths default libaudiohal.so

namespace. name . asan.permitted.paths

ডিরেক্টরিগুলির একটি কোলন-বিচ্ছিন্ন তালিকা যেখানে গতিশীল লিঙ্কার শেয়ার্ড লাইব্রেরিগুলি লোড করতে পারে যখন আসান সক্ষম করা হয়।

namespace. name . permitted.paths

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

এটি ইঙ্গিত করে যে যখন আসান সক্ষম করা হয় তখন /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 ফিরিয়ে দেয়। শেয়ার্ড লাইব্রেরিগুলি কেবল এই নেমস্পেসে লোড করা যেতে পারে যদি (1) তাদের অন্য লিঙ্কার নেমস্পেস দ্বারা অনুরোধ করা হয় যা এই নেমস্পেসের একটি ফ্যালব্যাক লিঙ্ক রয়েছে, বা (2) তারা এই নেমস্পেসে অন্যান্য ভাগ করা লাইব্রেরি বা এক্সিকিউটেবলদের দ্বারা অনুরোধ করা হয়েছে।

namespace. sphal. visible = true

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

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

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

  • ডিভাইস যদি ভিএনডিকে সমর্থন করে
  • বিক্রেতা পার্টিশনের লক্ষ্য vndk সংস্করণ
  • পণ্য পার্টিশন এর ভিএনডিকে সংস্করণ
  • অ্যাপেক্স মডিউল ইনস্টল করা হয়েছে

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

লিঙ্কার নেমস্পেস বিচ্ছিন্নতা

তিনটি কনফিগারেশন প্রকার রয়েছে। BoardConfig.mk -তে PRODUCT_TREBLE_LINKER_NAMESPACES এবং BOARD_VNDK_VERSION মানের উপর নির্ভর করে, বুটের সময় সম্পর্কিত কনফিগারেশনটি উত্পন্ন হয়।

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
নির্বাচিত কনফিগারেশন ভিটিএস প্রয়োজনীয়তা
true current VNDK অ্যান্ড্রয়েড 9 বা উচ্চতর দিয়ে চালু করা ডিভাইসগুলির জন্য বাধ্যতামূলক
খালি VNDK Lite অ্যান্ড্রয়েড 8.x দিয়ে চালু করা ডিভাইসগুলির জন্য বাধ্যতামূলক
false খালি Legacy ট্রিবল ডিভাইসগুলির জন্য

ভিএনডিকে লাইট কনফিগারেশন এসপি-অর্ধেক এবং ভিএনডিকে-এসপি ভাগ করে নেওয়া লাইব্রেরিগুলিকে বিচ্ছিন্ন করে। অ্যান্ড্রয়েড 8.0 এ, এটি অবশ্যই ডায়নামিক লিংকারের জন্য কনফিগারেশন ফাইল হতে হবে যখন PRODUCT_TREBLE_LINKER_NAMESPACES true হয়।

ভিএনডিকে কনফিগারেশনটি এসপি-অর্ধেক এবং ভিএনডিকে-এসপি ভাগ করা লাইব্রেরিগুলিকেও বিচ্ছিন্ন করে। এছাড়াও, এই কনফিগারেশনটি সম্পূর্ণ গতিশীল লিঙ্কার বিচ্ছিন্নতা সরবরাহ করে। এটি নিশ্চিত করে যে সিস্টেম পার্টিশনে মডিউলগুলি বিক্রেতার পার্টিশনে ভাগ করা লাইব্রেরিগুলির উপর নির্ভর করবে না এবং বিপরীতে।

অ্যান্ড্রয়েড 8.1 বা উচ্চতর ক্ষেত্রে, ভিএনডিকে কনফিগারেশন হ'ল ডিফল্ট কনফিগারেশন এবং এটি current সাথে BOARD_VNDK_VERSION সেট করে সম্পূর্ণ গতিশীল লিঙ্কার বিচ্ছিন্নতা সক্ষম করার জন্য সুপারিশ করা হয়।

Vndk কনফিগারেশন

ভিএনডিকে কনফিগারেশন সিস্টেম পার্টিশন এবং বিক্রেতার পার্টিশনের মধ্যে ভাগ করা লাইব্রেরির নির্ভরতাগুলি পৃথক করে। পূর্ববর্তী উপচ্ছেদে উল্লিখিত কনফিগারেশনের সাথে তুলনা করে, পার্থক্যগুলি নিম্নলিখিত হিসাবে বর্ণিত হয়েছে:

  • কাঠামো প্রক্রিয়া

    • default , vndk , sphal এবং rs নেমস্পেস তৈরি করা হয়।
    • সমস্ত নেমস্পেসগুলি বিচ্ছিন্ন হয়।
    • সিস্টেম শেয়ার্ড লাইব্রেরিগুলি default নেমস্পেসে লোড করা হয়।
    • এসপি-হেলগুলি sphal নেমস্পেসে লোড করা হয়।
    • ভিএনডিকে-এসপি ভাগ করা লাইব্রেরিগুলি vndk নেমস্পেসে লোড হয়েছে।
  • বিক্রেতা প্রক্রিয়া

    • default , vndk এবং system নেমস্পেসগুলি তৈরি করা হয়।
    • default নেমস্পেস বিচ্ছিন্ন।
    • বিক্রেতার ভাগ করা গ্রন্থাগারগুলি default নেমস্পেসে লোড করা হয়।
    • ভিএনডিকে এবং ভিএনডিকে-এসপি শেয়ার্ড লাইব্রেরিগুলি vndk নেমস্পেসে লোড করা হয়।
    • এলএল-এনডিকে এবং এর নির্ভরতাগুলি system নেমস্পেসে লোড করা হয়।

লিঙ্কার নেমস্পেসগুলির মধ্যে সম্পর্ক নীচে চিত্রিত করা হয়েছে।

লিঙ্কার নেমস্পেস গ্রাফ ভিএনডিকে কনফিগারেশনে বর্ণিত

চিত্র 1। লিঙ্কার নেমস্পেস বিচ্ছিন্নতা (ভিএনডিকে কনফিগারেশন)।

উপরের চিত্রটিতে, এলএল-এনডিকে এবং ভিএনডিকে-এসপি নিম্নলিখিত ভাগ করা লাইব্রেরিগুলির জন্য দাঁড়িয়েছে:

  • 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 লাইট কনফিগারেশন

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

লিঙ্কার নেমস্পেস গ্রাফ ভিএনডিকে লাইট কনফিগারেশনে বর্ণিত
চিত্র 2। লিঙ্কার নেমস্পেস বিচ্ছিন্নতা (ভিএনডিকে লাইট কনফিগারেশন)

এলএল-এনডিকে এবং ভিএনডিকে-এসপি নিম্নলিখিত শেয়ার্ড লাইব্রেরিগুলির জন্য স্ট্যান্ড:

  • 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
    • 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

নীচের টেবিলটি ফ্রেমওয়ার্ক প্রক্রিয়াগুলির জন্য নেমস্পেসস কনফিগারেশন তালিকাভুক্ত করে, যা ভিএনডিকে লাইট কনফিগারেশনের [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 (রেন্ডারস্ক্রিপ্টের জন্য) 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 Ll-ndk
libmediandk.so
libft2.so
link.vndk.shared_libs Vndk-sp

নীচের টেবিলটি বিক্রেতার প্রক্রিয়াগুলির জন্য নেমস্পেসস কনফিগারেশন উপস্থাপন করে, যা ভিএনডিকে লাইট কনফিগারেশনের [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 এ আরও বিশদ পাওয়া যাবে।

নথির ইতিহাস

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

  • অ্যান্ড্রয়েড 11 -এ, স্ট্যাটিক ld.config.*.txt

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

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