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

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

هندسة عامة

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

يجب عدم جعل المكتبات الأصلية التي تعد جزءًا من 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 .

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

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

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

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