নেটিভ লাইব্রেরির জন্য নামস্থান

অ্যান্ড্রয়েড ৭.০ নেটিভ লাইব্রেরির জন্য নেমস্পেস চালু করেছে, যার উদ্দেশ্য হলো অভ্যন্তরীণ এপিআই-এর দৃশ্যমানতা সীমিত করা এবং এমন পরিস্থিতির সমাধান করা যেখানে অ্যাপগুলো ভুলবশত নিজেদের লাইব্রেরির পরিবর্তে প্ল্যাটফর্ম লাইব্রেরি ব্যবহার করে ফেলে। অ্যাপ-নির্দিষ্ট পরিবর্তনগুলোর জন্য অ্যান্ড্রয়েড ডেভেলপারস-এর ব্লগ পোস্ট "Improving Stability with Private C/C++ Symbol Restrictions in Android 7.0" দেখুন।

স্থাপত্য

অ্যান্ড্রয়েড ৭.০ এবং এর পরবর্তী সংস্করণগুলোতে সিস্টেম লাইব্রেরিগুলো অ্যাপ লাইব্রেরি থেকে আলাদা করা হয়েছে।

নেটিভ লাইব্রেরির জন্য নেমস্পেস

চিত্র ১. নেটিভ লাইব্রেরিগুলোর নেমস্পেস।

নেটিভ লাইব্রেরির জন্য নেমস্পেস অ্যাপগুলোকে প্রাইভেট-প্ল্যাটফর্ম নেটিভ এপিআই ব্যবহার করা থেকে বিরত রাখে (যেমনটা OpenSSL-এর ক্ষেত্রে করা হয়েছিল)। এটি এমন পরিস্থিতিও দূর করে যেখানে অ্যাপগুলো ভুলবশত নিজেদের লাইব্রেরির পরিবর্তে প্ল্যাটফর্ম লাইব্রেরি ব্যবহার করে ফেলে (যেমনটা libpng এর ক্ষেত্রে দেখা গেছে)। অ্যাপ লাইব্রেরির পক্ষে ভুলবশত অভ্যন্তরীণ সিস্টেম লাইব্রেরি ব্যবহার করা কঠিন হয়ে পড়ে (এবং এর বিপরীতটিও সত্য)।

অতিরিক্ত নেটিভ লাইব্রেরি যোগ করুন

স্ট্যান্ডার্ড পাবলিক নেটিভ লাইব্রেরিগুলোর পাশাপাশি, সিলিকন ভেন্ডররা (অ্যান্ড্রয়েড ৭.০ থেকে) এবং ডিভাইস নির্মাতারা (অ্যান্ড্রয়েড ৯ থেকে) নিজ নিজ লাইব্রেরি ফোল্ডারের অধীনে অতিরিক্ত নেটিভ লাইব্রেরি রেখে এবং .txt ফাইলে সেগুলোর সুস্পষ্ট তালিকা তৈরি করে অ্যাপের ব্যবহারের জন্য তা সরবরাহ করতে পারে।

লাইব্রেরি ফোল্ডারগুলো হলো:

  • সিলিকন ভেন্ডরদের লাইব্রেরির জন্য /vendor/lib (৩২-বিটের জন্য) এবং /vendor/lib64 (৬৪-বিটের জন্য)
  • ডিভাইস প্রস্তুতকারকদের লাইব্রেরির জন্য /system/lib (৩২-বিটের জন্য) এবং /system/lib64 (৬৪-বিটের জন্য)

.txt ফাইলগুলো হলো:

  • সিলিকন ভেন্ডরদের লাইব্রেরির জন্য /vendor/etc/public.libraries.txt
  • ডিভাইস প্রস্তুতকারকদের লাইব্রেরির জন্য /system/etc/public.libraries-COMPANYNAME.txt প্রয়োজন, যেখানে COMPANYNAME বলতে প্রস্তুতকারকের নাম বোঝায় (যেমন awesome.company )। COMPANYNAME অবশ্যই [A-Za-z0-9_.-]+ এর সাথে মিলতে হবে; এতে অ্যালফানিউমেরিক অক্ষর, _, . (ডট) এবং - থাকবে। যদি কিছু লাইব্রেরি বাহ্যিক সমাধান প্রদানকারীদের থেকে আসে, তবে একটি ডিভাইসে এই ধরনের একাধিক .txt ফাইল থাকতে পারে।

system পার্টিশনে থাকা নেটিভ লাইব্রেরি, যা ডিভাইস প্রস্তুতকারকদের দ্বারা পাবলিক করা হয়, সেগুলোর নাম অবশ্যই lib*COMPANYNAME.so হতে হবে, যেমন, libFoo.awesome.company.so । অন্য কথায়, কোম্পানির নাম সাফিক্স ছাড়া libFoo.so কোনোভাবেই পাবলিক করা যাবে না। লাইব্রেরি ফাইলের নামের COMPANYNAME অবশ্যই সেই txt ফাইলের নামের COMPANYNAME সাথে মিলতে হবে, যেখানে লাইব্রেরির নামটি তালিকাভুক্ত থাকে।

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

অ্যান্ড্রয়েড ৮.০ থেকে শুরু করে, ভেন্ডর পাবলিক লাইব্রেরিগুলোতে নিম্নলিখিত অতিরিক্ত সীমাবদ্ধতা এবং প্রয়োজনীয় সেটআপগুলো রয়েছে:

  1. ভেন্ডরের নেটিভ লাইব্রেরিটিকে অবশ্যই সঠিকভাবে লেবেল করতে হবে যাতে অ্যাপগুলো এটি অ্যাক্সেস করতে পারে। যদি কোনো অ্যাপের (তৃতীয় পক্ষের অ্যাপ সহ) অ্যাক্সেসের প্রয়োজন হয়, তবে লাইব্রেরিটিকে একটি ভেন্ডর-নির্দিষ্ট file_contexts ফাইলে নিম্নলিখিতভাবে same_process_hal_file হিসাবে লেবেল করতে হবে:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    যেখানে libnative.so হলো নেটিভ লাইব্রেরির নাম।
  2. লাইব্রেরিটি, সরাসরি অথবা এর নির্ভরতাগুলোর মাধ্যমে পরোক্ষভাবে, VNDK-SP এবং LLNDK লাইব্রেরি ছাড়া অন্য কোনো সিস্টেম লাইব্রেরির উপর নির্ভর করতে পারবে না। VNDK-SP এবং LLNDK লাইব্রেরির তালিকাটি development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv খুঁজুন।

অ্যান্ড্রয়েড ১৫ থেকে, ভেন্ডর পাবলিক লাইব্রেরিগুলো একটি ভেন্ডর APEX- এ রাখা যায়। ভেন্ডর APEX-এ প্যাকেজ করার সময়, APEX ম্যানিফেস্টের provideNativeLibs প্রপার্টিতে লাইব্রেরিগুলোর তালিকা দিন।

অ্যাপগুলিকে এমনভাবে আপডেট করুন যাতে তারা ননপাবলিক নেটিভ লাইব্রেরি ব্যবহার না করে।

এই ফিচারটি শুধুমাত্র SDK ভার্সন ২৪ বা তার পরবর্তী সংস্করণ টার্গেট করা অ্যাপগুলোর জন্য সক্রিয় করা হয়েছে; ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য, টেবিল ১ দেখুন। আপনার অ্যাপ যদি প্রাইভেট নেটিভ লাইব্রেরির সাথে লিঙ্ক করে তবে কী আশা করা যায় । অ্যাপগুলোর জন্য অ্যাক্সেসযোগ্য অ্যান্ড্রয়েড নেটিভ লাইব্রেরির তালিকা (যা পাবলিক নেটিভ লাইব্রেরি নামেও পরিচিত) CDD সেকশন ৩.১.১-এ দেওয়া আছে। ২৪ বা তার পরবর্তী সংস্করণ টার্গেট করা এবং কোনো নন-পাবলিক লাইব্রেরি ব্যবহারকারী অ্যাপগুলো আপডেট করা উচিত। আরও বিস্তারিত জানতে ‘NDK Apps Linking to Platform Libraries’ দেখুন।

অ্যাপগুলিকে তাদের নেটিভ লাইব্রেরি নির্ভরতার জন্য আপডেট করুন

যেসব অ্যাপ SDK ভার্সন ৩১ (অ্যান্ড্রয়েড ১২) বা তার উচ্চতর সংস্করণকে টার্গেট করে, সেগুলোকে অবশ্যই অ্যাপ ম্যানিফেস্টে <uses-native-library> ট্যাগ ব্যবহার করে তাদের নেটিভ শেয়ার্ড লাইব্রেরি নির্ভরতা স্পষ্টভাবে উল্লেখ করতে হবে। অনুরোধ করা লাইব্রেরির কোনো অংশ ডিভাইসে না থাকলে, অ্যাপটি ইনস্টল হয় না। অ্যাপগুলো ইনস্টল হয়ে গেলে, সেগুলোকে শুধুমাত্র সেই নেটিভ শেয়ার্ড লাইব্রেরিগুলোই সরবরাহ করা হয়, যেগুলোর জন্য তারা অনুরোধ করেছে। এর মানে হলো, অ্যাপ ম্যানিফেস্টে উল্লেখ নেই এমন কোনো নেটিভ শেয়ার্ড লাইব্রেরি অ্যাপগুলো অ্যাক্সেস করতে পারে না।