Android 7.0 فضاهای نام را برای کتابخانههای بومی معرفی کرد تا رؤیتپذیری میانای برنامهسازی کاربردی داخلی را محدود کند و شرایطی را که برنامهها بهطور تصادفی از کتابخانههای پلاتفرم بهجای کتابخانههای خودشان استفاده میکنند حل کند. برای اطلاع از تغییرات مختص برنامه، پست وبلاگ بهبود پایداری با محدودیتهای نماد C/C++ خصوصی در Android 7.0 «توسعهدهندگان Android» را ببینید.
معماری
در Android 7.0 و بالاتر، کتابخانههای سیستم از کتابخانههای برنامه جدا شدهاند.
شکل ۱. فضاهای نام برای کتابخانههای بومی.
فضاهای نام برای کتابخانههای بومی از برنامهها دراستفاده از
واسطهای برنامهسازی کاربردی بومی پلاتفرم خصوصی جلوگیری میکند (همانطور که با OpenSSL انجام شد). همچنین شرایطی را که در آن برنامهها بهطور تصادفی بهجای کتابخانههای خود از کتابخانههای پلاتفرم استفاده میکنند (همانطور که در libpng مشاهده شد) حذف میکند. برای کتابخانههای برنامه دشوار است که بهطور تصادفی از کتابخانههای سیستم داخلی استفاده کنند (و بالعکس).
افزودن کتابخانههای بومی اضافی
علاوهبر کتابخانههای بومی عمومی استاندارد، فروشندگان سیلیکون (از Android 7.0) و سازندگان دستگاه (از Android 9) ممکن است تصمیم بگیرند کتابخانههای بومی بیشتری را با قرار دادن آنها در پوشههای کتابخانه مربوطه و فهرست کردن صریح آنها در فایلهای 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 هستند نباید عمومی شوند (بهجز کتابخانههای بومی عمومی استاندارد که بهطور پیشفرض عمومی هستند). فقط کتابخانههای اضافی که توسط فروشندگان سیلیکون یا سازندگان دستگاه اضافه شدهاند میتوانند برای برنامهها دردسترس قرار گیرند.
از Android 8.0، کتابخانههای عمومی فروشنده محدودیتهای اضافی زیر را دارند و باید تنظیمات زیر را انجام دهند:
- کتابخانه بومی در فروشنده باید بهدرستی برچسبگذاری شود تا برای برنامهها قابلدسترسی باشد. اگر هر برنامهای (ازجمله برنامههای طرف سوم) به دسترسی نیاز داشته باشد، کتابخانه باید در فایل
file_contextsمخصوص فروشنده بهصورت زیر برچسبگذاری شود:same_process_hal_file که/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
libnative.soنام کتابخانه بومی است. - کتابخانه، چه بهطور مستقیم و چه ازطریق وابستگیهایش، نباید به کتابخانههای سیستم بهجز کتابخانههای VNDK-SP و LLNDK وابسته باشد. فهرست کتابخانههای VNDK-SP و LLNDK را در
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csvپیدا کنید.
از Android 15، کتابخانههای عمومی فروشنده را میتوان در
APEX فروشنده قرار داد. وقتی در APEX فروشنده بستهبندی میشود، کتابخانهها را
در دارایی provideNativeLibs در مانیفست APEX فهرست کنید.
برنامهها را بهروزرسانی کنید تا از کتابخانههای بومی غیرعمومی استفاده نکنند
این ویژگی فقط برای برنامههایی که نسخه ۲۴ یا جدیدتر «کیت توسعه نرمافزار» را هدفیابی میکنند فعال است؛ برای سازگاری با نسخههای قدیمیتر، جدول ۱ را ببینید. اگر برنامه شما با کتابخانههای بومی خصوصی پیوند دارد، چه انتظاری باید داشته باشید. فهرست کتابخانههای بومی Android که برنامهها میتوانند به آنها دسترسی داشته باشند (همچنین بهعنوان کتابخانههای بومی عمومی شناخته میشوند) در بخش ۳.۱.۱ «سند سازگاری Android» فهرست شده است. برنامههایی که ۲۴ یا نسخههای جدیدتر را هدف قرار میدهند و از کتابخانههای غیرعمومی استفاده میکنند باید بهروز شوند. برای جزئیات بیشتر، برنامههای NDK پیونددهنده به کتابخانههای پلاتفرم را ببینید.
برنامهها را برای وابستگیهای کتابخانه بومیشان بهروز کنید
برنامههایی که نسخه ۳۱ کیت توسعه نرمافزار (Android 12) یا بالاتر را هدفیابی میکنند باید وابستگیهای کتابخانه مشترک بومی خود را بااستفاده از برچسب <uses-native-library> در مانیفست برنامه بهصراحت مشخص کنند. اگر بخشی از کتابخانه درخواستی در دستگاه وجود نداشته باشد، برنامه نصب نمیشود. وقتی برنامهها نصب میشوند،
فقط کتابخانههای مشترک بومی که درخواست کردهاند دراختیارشان قرار میگیرد. این یعنی
برنامهها نمیتوانند به کتابخانههای مشترک بومی که در مانیفست برنامه نشان داده نمیشوند دسترسی داشته باشند.