يتضمن تنفيذ إيقاف التشغيل الديناميكي توصيل تدفقات البيانات وتنفيذ والعمليات الديناميكية كما هو موضح في الأقسام التالية.
التغييرات على تعريفات HAL
يتطلب إيقاف التشغيل الديناميكي معلومات عن العمليات التي تؤدي إلى وظيفة تجريد الأجهزة (HAL) (قد تكون هذه المعلومات مفيدة أيضًا في وقت لاحق في سياقات أخرى) وكذلك عدم بدء العمليات عند التمهيد وعدم إعادة تشغيلها (حتى طلبها مرة أخرى) عند خروجه.
# some init.rc script associated with the HAL service vendor.some-service-name /vendor/bin/hw/some-binary-service # init language extension, provides information of what service is served # if multiple interfaces are served, they can be specified one on each line interface android.hardware.light@2.0::ILight default # restarted if hwservicemanager dies # would also cause the hal to start early during boot if disabled wasn't set class hal # will not be restarted if it exits until it is requested to be restarted oneshot # will only be started when requested disabled # ... other properties
التغييرات على init وhwservicemanager
يتطلب إيقاف التشغيل الديناميكي من "hwservicemanager
" أيضًا إبلاغ
init
لبدء الخدمات المطلوبة. في نظام Android 9،
يتضمن init
ثلاث رسائل تحكم إضافية (مثل
ctl.start
): ctl.interface_start
،
ctl.interface_stop
، وctl.interface_restart
.
يمكن استخدام هذه الرسائل لإرسال إشارة إلى "init
" للخروج أو للأسفل
واجهات أجهزة محددة. عندما يتم طلب خدمة ولا يتم
مسجَّلة، يطلب hwservicemanager
بأن تكون الخدمة
البدء. ومع ذلك، لا تتطلب HALs الديناميكية استخدام أي من هذه الأدوات.
تحديد مخرج HAL
في Android 9، يجب الخروج من HAL يدويًا الشركة. بالنسبة إلى نظام التشغيل Android 10 والإصدارات الأحدث، يمكن أيضًا على تحديد دورات حياة تلقائية.
يتطلب إيقاف التشغيل الديناميكي سياسات متعددة لتحديد وقت بدء
HAL ومتى يتم إغلاق HAL. إذا قررت "HAL" الخروج لأي سبب،
ستتم إعادة تشغيله تلقائيًا عند الحاجة إليه مرة أخرى باستخدام المعلومات
المقدمة في تعريف HAL والبنية الأساسية التي تتضمنها التغييرات
"init
" وhwservicemanager
" قد يتضمن ذلك
استراتيجيتين مختلفتين، بما في ذلك:
- يمكن أن يختار بروتوكول HAL استدعاء الخروج من تلقاء نفسه إذا اتصل شخص ما بإغلاق أو واجهة برمجة تطبيقات مشابهة عليه. يجب تحديد هذا السلوك في HAL المقابل. من واجهة pyplot.
- يمكن أن يتم إيقاف تشغيل HALs عند اكتمال المهمة (وهو موثق في HAL) ).
دورات حياة تلقائية
يضيف Android 10 مزيدًا من الدعم إلى النواة
hwservicemanager
، ما يسمح بإيقاف تشغيل عمليات HAL تلقائيًا
عندما لا يكون لديهم عملاء. لاستخدام هذه الميزة، قم بجميع الخطوات الموجودة في
إجراء تغييرات على تعريفات HAL أيضًا
كـ:
- تسجيل الخدمة في C++ من خلال
LazyServiceRegistrar
بدلاً من دالة العضو،registerAsService
، مثال:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- التحقق من أن عميل HAL يحتفظ بإشارة إلى HAL ذو المستوى الأعلى (
المسجّلة في
hwservicemanager
) فقط عندما قيد الاستخدام. لتجنُّب التأخيرات إذا تم إسقاط هذا المرجع في سلسلة محادثات hwbinder يستمر التنفيذ، على العميل أيضًا استدعاءIPCThreadState::self()->flushCommands()
بعد إسقاط الرجوع للتأكد من إعلام برنامج تشغيل الحافظات التغييرات في عدد المراجع.