فضای نام برای کتابخانه های بومی

اندروید ۷.۰ فضاهای نامی را برای کتابخانه‌های بومی معرفی کرد تا قابلیت مشاهده API داخلی را محدود کند و موقعیت‌هایی را که برنامه‌ها به‌طور تصادفی از کتابخانه‌های پلتفرم به جای کتابخانه‌های خودشان استفاده می‌کنند، حل کند. برای تغییرات خاص برنامه، به پست وبلاگ توسعه‌دهندگان اندروید با عنوان «بهبود پایداری با محدودیت‌های نماد خصوصی C/C++ در اندروید ۷.۰» مراجعه کنید.

معماری

در اندروید ۷.۰ و بالاتر، کتابخانه‌های سیستم از کتابخانه‌های برنامه جدا شده‌اند.

فضاهای نام برای کتابخانه‌های بومی

شکل ۱. فضاهای نام برای کتابخانه‌های بومی.

فضاهای نام برای کتابخانه‌های بومی مانع از استفاده برنامه‌ها از APIهای بومی پلتفرم خصوصی می‌شوند (همانطور که با 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 در نام فایل کتابخانه باید با COMPANYNAME در نام فایل txt که نام کتابخانه در آن ذکر شده است، مطابقت داشته باشد.

کتابخانه‌های بومی که بخشی از AOSP هستند، نباید عمومی شوند (به جز کتابخانه‌های بومی عمومی استاندارد که به طور پیش‌فرض عمومی هستند). فقط کتابخانه‌های اضافی اضافه شده توسط فروشندگان سیلیکون یا سازندگان دستگاه می‌توانند برای برنامه‌ها قابل دسترسی باشند.

از اندروید ۸.۰ به بعد، کتابخانه‌های عمومی تولیدکننده، محدودیت‌های اضافی و تنظیمات مورد نیاز زیر را دارند:

  1. کتابخانه بومی در فروشنده باید به درستی برچسب‌گذاری شود تا برنامه‌ها بتوانند به آن دسترسی داشته باشند. اگر دسترسی توسط هر برنامه‌ای (از جمله برنامه‌های شخص ثالث) مورد نیاز باشد، کتابخانه باید به صورت same_process_hal_file در یک فایل file_contexts مخصوص فروشنده به شرح زیر برچسب‌گذاری شود:
    /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 بیابید.

از اندروید ۱۵ به بعد، کتابخانه‌های عمومی vendor می‌توانند در APEX vendor قرار داده شوند. هنگام بسته‌بندی در APEX vendor، کتابخانه‌ها را در یک ویژگی provideNativeLibs در مانیفست APEX فهرست کنید.

برنامه‌ها را به‌روزرسانی کنید تا از کتابخانه‌های بومی غیرعمومی استفاده نکنند

این ویژگی فقط برای برنامه‌هایی که SDK نسخه ۲۴ یا بالاتر را هدف قرار می‌دهند فعال است؛ برای سازگاری با نسخه‌های قبلی، به جدول ۱ مراجعه کنید. اگر برنامه شما به کتابخانه‌های بومی خصوصی متصل می‌شود، چه انتظاری باید داشته باشید . فهرست کتابخانه‌های بومی اندروید که برای برنامه‌ها قابل دسترسی هستند (همچنین به عنوان کتابخانه‌های بومی عمومی شناخته می‌شوند) در بخش ۳.۱.۱ از CDD فهرست شده است. برنامه‌هایی که نسخه ۲۴ یا بالاتر را هدف قرار می‌دهند و از هرگونه کتابخانه غیرعمومی استفاده می‌کنند، باید به‌روزرسانی شوند. برای جزئیات بیشتر به بخش «پیوند برنامه‌های NDK به کتابخانه‌های پلتفرم» مراجعه کنید.

به‌روزرسانی برنامه‌ها برای وابستگی‌های کتابخانه‌ای بومی آنها

برنامه‌هایی که SDK نسخه ۳۱ (اندروید ۱۲) یا بالاتر را هدف قرار می‌دهند، باید وابستگی‌های کتابخانه مشترک بومی خود را با استفاده از برچسب <uses-native-library> در مانیفست برنامه، صریحاً مشخص کنند . اگر هر بخشی از کتابخانه درخواستی در دستگاه وجود نداشته باشد، برنامه نصب نمی‌شود. وقتی برنامه‌ها نصب می‌شوند، فقط کتابخانه‌های مشترک بومی که درخواست کرده‌اند، در اختیارشان قرار می‌گیرد. این بدان معناست که برنامه‌ها نمی‌توانند به کتابخانه‌های مشترک بومی که در مانیفست برنامه ظاهر نمی‌شوند، دسترسی داشته باشند.