تشغيل خدمات AIDL ديناميكيًا

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

الخدمات التي يمكن تشغيلها بشكل ديناميكي

لا تتوفَّر هذه الميزة إلا للخدمات الأصلية التي يمكن أن تكون مراحل نشاطها يتحكّم فيه init وservicemanager. لا يُسمَح باستخدام الخدمات ضمن حِزم التطبيقات، ويجب استخدام الخدمات المرتبطة بدلاً منها.

يعمل الإيقاف الديناميكي من خلال إيقاف العملية التي تعمل فيها الخدمة. إذا كانت هناك خدمات متعدّدة في العملية نفسها، يجب تسجيلها جميعًا كخدمات ديناميكية لتتوافق مع هذه الميزة. سيتم إيقاف هذه العملية بعد ذلك عند عدم استخدام جميع الخدمات.

ضبط ملف init .rc للخدمة

لتشغيل خدمة ديناميكيًا، أضِف الخيارات التالية إلى إعدادات الخدمة. ملف .rc بعد سطر service <name> <cmd> البادئة.

interface aidl serviceName
disabled
oneshot

وتعمل هذه الخيارات على تنفيذ ما يلي:

  • interface aidl serviceName: يسمح هذا الإذن servicemanager بالعثور على الخدمة. إذا كانت الخدمة تستخدم واجهات متعددة، يجب تحديد كل واجهة على حدة. الخط. يجب أن تتطابق هذه الأسماء بالضبط مع ما يتوقّعه تطبيق servicemanager وقد عن اسم العملية.
  • disabled: يمنع بدء الخدمة تلقائيًا عند بدء التشغيل.
  • oneshot: يمنع إعادة تشغيل الخدمة تلقائيًا في كل مرة يتم فيها إيقافها.

لمزيد من المعلومات، يُرجى الاطّلاع على ملف Readme الخاص بلغة Android Init في AOSP.

أمثلة:

تسجيل خدمة

يتم إنشاء كل خدمة وتسجيلها في servicemanager. غالبًا ما يتم تسجيل العلامة في ملف باسم main.cpp، ولكن قد يختلف التنفيذ. تشير رسالة الأشكال البيانية التسجيل عادةً على النحو التالي:

using android::defaultServiceManager;

defaultServiceManager()->addService(serviceName, service);

يتم أحيانًا استخلاص التسجيل من قِبل BinderService::publish أو BinderService::instantiate، الذي يستدعي الرمز أعلاه.

لتسجيل خدمة على أنّها ديناميكية، استبدِل رمز تسجيلها بما يلي:

#include <binder/LazyServiceRegistrar.h>

using android::binder::LazyServiceRegistrar;

auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);

يتواصل servicemanager مع LazyServiceRegistrar لإيقاف الخدمات استنادًا إلى أعداد الإحالات.

أمثلة:

ضبط برامج خدمة AIDL

الحصول على الخدمة

لاسترداد خدمة بطيئة، يجب بدء الخدمة ثم استردادها. سيؤدي الاتصال بـ getService في مدير الخدمة إلى بدء الخدمة، ولكن عادةً ما يكون المطلوب الحصول على الخدمة فور توفّرها، ويجب استخدام waitForService الصيغ. الاطِّلاع على الخاص بالواجهة الخلفية المستندات حول كيفية استخدامها.

طرح الخدمة

يعتمد إيقاف التشغيل الديناميكي على احتساب المراجع، لذلك يجب على العملاء عدم التمسك الخدمة عندما لا تكون قيد الاستخدام.

أمثلة:

إيقاف التشغيل مؤقتًا

إذا كنت تريد تشغيل خدمة بشكل مستقل إلى أن تكتمل مهام معيّنة ثم التبديل إلى السلوك الديناميكي، يمكنك استخدام LazyServiceRegistrar::forcePersist لتفعيل وضع الإيقاف/التشغيل الديناميكي وإيقافه. إذا كان يتم استدعاء هذا الإجراء من جانب الخادم، يجب استدعاؤه قبل registerService.

مثال: apexservice