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

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

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

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

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

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

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

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

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

تصميم ConfigStore HAL

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

تصميم Configstore HAL

الشكل 1: تصميم ConfigStore HAL

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

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

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

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