مساحات أسماء المكتبات الأصلية

في Android 7.0، تم تقديم مساحات أسماء للمكتبات الأصلية للحدّ من إمكانية الاطّلاع على واجهات برمجة التطبيقات الداخلية وحلّ الحالات التي تستخدم فيها التطبيقات عن طريق الخطأ مكتبات النظام بدلاً من مكتباتها الخاصة. للاطّلاع على التغييرات الخاصة بالتطبيقات، يُرجى قراءة مشاركة مدونة Android Developers بعنوان تحسين الاستقرار من خلال فرض قيود على رموز C/C++ الخاصة في Android 7.0.

هندسة معمارية

في Android 7.0 والإصدارات الأحدث، يتم فصل مكتبات النظام عن مكتبات التطبيقات.

مساحات الأسماء للمكتبات الأصلية

الشكل 1: مساحات أسماء للمكتبات الأصلية

تمنع مساحات أسماء المكتبات الأصلية التطبيقات من استخدام واجهات برمجة التطبيقات الأصلية الخاصة بالمنصة (كما كان يحدث مع OpenSSL). كما أنّها تزيل الحالات التي تستخدم فيها التطبيقات عن طريق الخطأ مكتبات النظام بدلاً من مكتباتها الخاصة (كما حدث مع libpng). ويصعب على مكتبات التطبيقات استخدام مكتبات النظام الداخلية عن طريق الخطأ (والعكس صحيح).

إضافة مكتبات أصلية إضافية

بالإضافة إلى المكتبات الأصلية العامة العادية، يمكن لمورّدي السيليكون (بدءًا من Android 7.0) ومصنّعي الأجهزة (بدءًا من Android 9) اختيار توفير مكتبات أصلية إضافية يمكن للتطبيقات الوصول إليها من خلال وضعها ضِمن مجلدات المكتبات المعنيّة وإدراجها صراحةً في ملفات ‎ .txt.

مجلدات المكتبات هي:

  • /vendor/lib (للأجهزة التي تعمل بنظام 32 بت) و/vendor/lib64 (للأجهزة التي تعمل بنظام 64 بت) للمكتبات من مورّدي السيليكون
  • /system/lib (للأجهزة التي تعمل بنظام 32 بت) و/system/lib64 (للأجهزة التي تعمل بنظام 64 بت) للمكتبات من مصنّعي الأجهزة

ملفات ‎ .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 الذي تم إدراج اسم المكتبة فيه.

يجب عدم إتاحة المكتبات الأصلية التي تشكّل جزءًا من مشروع Android مفتوح المصدر (AOSP) للجميع (باستثناء المكتبات الأصلية العامة العادية التي تكون متاحة للجميع تلقائيًا). لا يمكن إتاحة الوصول إلى التطبيقات إلا للمكتبات الإضافية التي يضيفها مورّدو السيليكون أو مصنّعو الأجهزة.

بدءًا من Android 8.0، تخضع المكتبات العامة الخاصة بالمورّدين للقيود وعمليات الإعداد المطلوبة الإضافية التالية:

  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.

بدءًا من Android 15، يمكن وضع المكتبات العامة الخاصة بالمورّدين في حزمة APEX خاصة بالمورّد . عند تجميع المكتبات في حزمة APEX خاصة بالمورّد، يجب إدراجها في السمة provideNativeLibs في ملف بيان حزمة APEX.

تعديل التطبيقات لكي لا تستخدم المكتبات الأصلية غير العامة

لا يتم تفعيل هذه الميزة إلا للتطبيقات التي تستهدف الإصدار 24 من حزمة تطوير البرامج (SDK) أو الإصدارات الأحدث؛ ولضمان التوافق مع الإصدارات السابقة، يُرجى الاطّلاع على الجدول 1.ما يمكن أن تتوقّعه إذا كان تطبيقك يربط بمكتبات أصلية خاصة يتم إدراج قائمة المكتبات الأصلية لنظام Android التي يمكن للتطبيقات الوصول إليها (المعروفة أيضًا باسم المكتبات الأصلية العامة) في القسم 3.1.1 من مستند تعريف التوافق مع Android. يجب تعديل التطبيقات التي تستهدف الإصدار 24 من حزمة تطوير البرامج (SDK) أو الإصدارات الأحدث وتستخدم أي مكتبات غير عامة. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة ربط تطبيقات NDK بمكتبات المنصة .

تعديل التطبيقات لكي تعتمد على المكتبات المجمّعة من رموز برمجية أصلية

يجب أن تحدّد صراحةً التطبيقات التي تستهدف الإصدار 31 من حزمة تطوير البرامج (SDK) (الإصدار 12 من نظام التشغيل Android) أو الإصدارات الأحدث تبعياتها من المكتبات المشتركة الأصلية باستخدام العلامة <uses-native-library> في ملف بيان التطبيق. إذا لم يكن أي جزء من المكتبة المطلوبة متوفّرًا على الجهاز، لن يتم تثبيت التطبيق. عند تثبيت التطبيقات، يتم تزويدها فقط بالمكتبات المشتركة الأصلية التي طلبتها. يعني ذلك أنّه لا يمكن للتطبيقات الوصول إلى المكتبات المشتركة الأصلية التي لا تظهر في ملف بيان التطبيق.