واجهة برمجة التطبيقات لـ ConfigStore

في Android 10، يستخدم ConfigStore HAL علامات الإصدار لتخزين قيم الإعدادات في قسم vendor، وتصل إحدى الخدمات في القسم system إلى هذه القيم باستخدام HIDL (ينطبق هذا أيضًا في Android 9). ومع ذلك، تم إيقاف HAL ConfigStore نهائيًا بسبب استهلاكه المكثّف للذاكرة وصعوبة استخدامه.

سيظلّ واجهة برمجة التطبيقات ConfigStore HAL متوفّرة في AOSP لتوفير أقسام المورّدين القديمة. على الأجهزة التي تعمل بالإصدار 10 من نظام التشغيل Android أو الإصدارات الأحدث، يقرأ تطبيق "surfaceflinger" خصائص النظام أولاً. إذا لم يتم تحديد خاصيّة نظام لعنصر إعداد في "SurfaceFlingerProperties.sysbro"، يتم الرجوع إلى "surfaceflinger" إلى عملية HAL في حال توفّر السمة.

يقسّم نظام التشغيل Android 8.0 نظام التشغيل Android المتكامل إلى أقسام عامة (system.img) وأقسام خاصة بالأجهزة (vendor.img و odm.img). نتيجةً لهذا التغيير، يجب إزالة عملية الترجمة الشَرطية من الوحدات المثبَّتة في ملف التمهيد النظام، ويجب أن تحدِّد هذه الوحدات إعدادات النظام أثناء التشغيل (وتتصرف بشكلٍ مختلف استنادًا إلى هذه الإعدادات).

يوفّر واجهة برمجة التطبيقات ConfigStore HAL مجموعة من واجهات برمجة التطبيقات للوصول إلى عناصر الإعدادات للقراءة فقط المستخدَمة لضبط إطار عمل Android. تصف هذه الصفحة تصميم ConfigStore HAL (وسبب عدم استخدام خصائص النظام لهذا الغرض)؛ وتعرض صفحات أخرى في هذا القسم بالتفصيل واجهة HAL وتنفيذ الخدمة والاستخدام من جهة العميل، وجميعها تستخدم surfaceflinger كمثال. للحصول على مساعدة بشأن فئات واجهة ConfigStore، يمكنك الاطّلاع على إضافة فئات وعناصر الواجهة.

لماذا لا يتم استخدام سمات النظام؟

لقد فكّرنا في استخدام سمات النظام، ولكننا واجهنا عدة مشاكل أساسية، من بينها:

  • حدود الطول المسموح به للقيم تفرض خصائص النظام حدودًا محددة على طول قيمها (92 بايت). بالإضافة إلى ذلك، بما أنّه تم عرض هذه الحدود مباشرةً لتطبيقات Android كوحدات ماكرو C، يمكن أن يؤدي زيادة الطول إلى حدوث مشاكل في التوافق مع الإصدارات القديمة.
  • عدم توفّر أنواع معيّنة جميع القيم هي سلاسل نصية في الأساس، وتعمل واجهات برمجة التطبيقات على تحليل السلسلة إلى int أو bool. أما أنواع البيانات المُركّبة الأخرى (مثل المصفوفة والبنية)، فيجب أن يتم ترميزها أو فك ترميزها من خلال البرامج (على سبيل المثال، يمكن ترميز "aaa,bbb,ccc" كمصفوفة من ثلاث سلاسل).
  • عمليات الاستبدال بما أنّ خصائص النظام للقراءة فقط يتم تنفيذها كخصائص للكتابة مرة واحدة، على المورّدين/مصنّعي الأجهزة الأصليين الذين يريدون إلغاء القيم للقراءة فقط التي حدّدها إطار عمل AOSP استيراد قيمهم للقراءة فقط قبل القيم للقراءة فقط التي حدّدها إطار عمل AOSP. ويؤدي ذلك بدوره إلى إلغاء القيم القابلة للإعادة الكتابة التي يحدّدها المورّد من خلال القيم التي يحدّدها إطار عمل AOSP.
  • متطلبات مساحة العناوين: تستهلك سمات النظام مقدارًا كبيرًا نسبيًا من مساحة العناوين في كل عملية. يتم تجميع ملفات النظام في وحدات prop_area بحجم ثابت يبلغ 128 كيلوبايت، ويتم تخصيص كل هذه الوحدات لمساحة عناوين العملية حتى إذا كان يتم الوصول إلى ملف نظام واحد فقط فيها. ويمكن أن يؤدي ذلك إلى حدوث مشاكل على الأجهزة التي تعمل بنظام 32 بت حيث تكون مساحة العناوين قيّمة.

حاولنا التغلب على هذه القيود بدون التضحية بالتوافق، لكنّنا ظلّنا قلقين من أنّ خصائص النظام لم يتم تصميمها للسماح بالوصول إلى عناصر الضبط للقراءة فقط. في النهاية، قرّرنا أنّه خصائص النظام هي الأنسب لمشاركة بعض العناصر التي يتم تعديلها ديناميكيًا على مستوى Android بالكامل في الوقت الفعلي، وأنّ هناك حاجة إلى نظام جديد مخصّص للوصول إلى عناصر الضبط للقراءة فقط.

تصميم واجهة برمجة التطبيقات ConfigStore HAL

التصميم الأساسي بسيط:

تصميم HAL في Configstore

الشكل 1: تصميم واجهة برمجة التطبيقات ConfigStore HAL

  • وصف علامات الإنشاء (التي تُستخدَم حاليًا لتجميع الإطار العملي بشكل مشروط) في HIDL
  • يوفّر الموردون والمصنّعون الأصليون للأجهزة قيمًا خاصة بالجهاز عند إنشاء العلامات من خلال تنفيذ خدمة HAL.
  • عدِّل إطار العمل لاستخدام خدمة HAL للعثور على قيمة أحد عناصر الإعدادات أثناء التشغيل.

يتم تضمين عناصر الضبط التي يشير إليها إطار العمل حاليًا في حزمة HIDL ذات الإصدار (android.hardware.configstore@1.0). يقدّم المورّدون/الشركات المصنّعة الأصلية للأجهزة قيمًا لعناصر الضبط من خلال تنفيذ الموصّلات في هذه الحزمة، ويستخدم إطار العمل الموصّلات عندما يحتاج إلى الحصول على قيمة لعنصر الضبط.

اعتبارات الأمان

تتأثر علامات الإصدار المحددة في الواجهة نفسها بسياسة SELinux نفسها. إذا كان يجب أن تتضمّن علامة بناء واحدة أو أكثر سياسات SELinux مختلفة، يجب فصلها إلى واجهة أخرى. وقد يتطلّب ذلك مراجعة رئيسية لـ android.hardware.configstore package لأنّ الواجهات المنفصلة لم تعُد متوافقة مع الإصدارات القديمة.