HALs متاحة ديناميكيًا

يتيح Android 9 الإيقاف الديناميكي لأجهزة Android. الأنظمة الفرعية عندما لا تكون قيد الاستخدام أو غير ضرورية. على سبيل المثال، عندما يكون لدى مستخدم لا تستخدم شبكة Wi-Fi، فلن تستهلك أنظمة Wi-Fi الفرعية مساحة في الذاكرة، أو الطاقة أو موارد النظام الأخرى. في الإصدارات السابقة من Android، تكون HALs/برامج التشغيل مفتوحة على أجهزة Android طوال المدة التي تم تشغيل الهاتف.

يتضمن تنفيذ إيقاف التشغيل الديناميكي توصيل تدفقات البيانات وتنفيذ والعمليات الديناميكية كما هو موضح في الأقسام التالية.

التغييرات على تعريفات 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() بعد إسقاط الرجوع للتأكد من إعلام برنامج تشغيل الحافظات التغييرات في عدد المراجع.