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

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

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

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

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

الشكل 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 الذي يتضمّن اسم المكتبة.

يجب عدم إتاحة المكتبات المجمّعة من رموز برمجية أصلية التي تشكّل جزءًا من 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 من CDD. يجب تحديث التطبيقات التي تستهدف الإصدار 24 أو الإصدارات الأحدث وتستخدم أي مكتبات غير علنية. اطّلِع على NDK ربط التطبيقات بمكتبات المنصة لمزيد من التفاصيل.

تحديث التطبيقات لتتوافق مع مكتباتها الأصلية

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