بدءًا من نظام التشغيل 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