डाइनैमिक तौर पर उपलब्ध एचएएल

Android 9 में, Android हार्डवेयर सबसिस्टम के इस्तेमाल में न होने या ज़रूरत न पड़ने पर, उन्हें डाइनैमिक तौर पर बंद करने की सुविधा है. उदाहरण के लिए, जब कोई उपयोगकर्ता वाई-फ़ाई का इस्तेमाल नहीं कर रहा है, तो वाई-फ़ाई सबसिस्टम को मेमोरी, पावर या सिस्टम के अन्य संसाधनों का इस्तेमाल नहीं करना चाहिए. Android के पुराने वर्शन में, Android डिवाइसों पर एचएएल/ड्राइवर को तब तक चालू रखा जाता था, जब तक Android फ़ोन बूट होता था.

डाइनैमिक शटडाउन लागू करने के लिए, डेटा फ़्लो को जोड़ना और डाइनैमिक प्रोसेस को लागू करना ज़रूरी है. इनके बारे में यहां दिए गए सेक्शन में बताया गया है.

एचएएल की परिभाषाओं में बदलाव

डाइनैमिक शटडाउन के लिए, यह जानकारी ज़रूरी है कि कौनसी प्रोसेस कौनसे एचएएल इंटरफ़ेस को सेवा देती हैं. यह जानकारी, बाद में दूसरे संदर्भों में भी काम की हो सकती है. साथ ही, यह भी ज़रूरी है कि बूट होने पर प्रोसेस शुरू न हों और प्रोसेस बंद होने पर उन्हें फिर से शुरू न किया जाए. हालांकि, ऐसा तब तक नहीं किया जाएगा, जब तक फिर से अनुरोध न किया जाए.

# 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 सेवा शुरू करने का अनुरोध करता है. हालांकि, डाइनैमिक एचएएल के लिए इनमें से किसी भी एट्रिब्यूट का इस्तेमाल करना ज़रूरी नहीं है.

एचएएल के बाहर निकलने का समय तय करना

Android 9 में, एचएएल के बंद होने का समय मैन्युअल तरीके से तय करना पड़ता है. Android 10 और उसके बाद के वर्शन के लिए, अपने-आप लाइफ़साइकल तय होने की सुविधा का इस्तेमाल करके भी यह तय किया जा सकता है.

डाइनैमिक शटडाउन के लिए, कई नीतियों की ज़रूरत होती है. इन नीतियों से यह तय किया जाता है कि किसी एचएएल को कब शुरू किया जाए और कब बंद किया जाए. अगर कोई एचएएल किसी वजह से बंद हो जाता है, तो init और hwservicemanager में किए गए बदलावों से मिले इन्फ़्रास्ट्रक्चर और एचएएल की परिभाषा में दी गई जानकारी का इस्तेमाल करके, ज़रूरत पड़ने पर वह अपने-आप फिर से शुरू हो जाएगा. इसमें कुछ अलग-अलग रणनीतियां शामिल हो सकती हैं. जैसे:

  • अगर कोई व्यक्ति उस पर मिलता-जुलता या करीबी एपीआई कॉल करता है, तो एचएएल खुद ही 'बाहर निकलें' कॉल कर सकता है. इस व्यवहार के बारे में, उससे जुड़े एचएएल इंटरफ़ेस में बताया जाना चाहिए.
  • अपना टास्क पूरा होने पर, एचएएल बंद हो सकते हैं. इसकी जानकारी, एचएएल फ़ाइल में दी गई होती है.

अपने-आप चलने वाले लाइफ़साइकल

Android 10 में, kernel और hwservicemanager के लिए ज़्यादा सहायता जोड़ी गई है. इससे, जब भी कोई क्लाइंट न हो, तब एचएएल अपने-आप बंद हो जाते हैं. इस सुविधा का इस्तेमाल करने के लिए, HAL की परिभाषाओं में हुए बदलाव में बताए गए सभी चरणों को पूरा करें. साथ ही, ये काम भी करें:

  • सदस्य फ़ंक्शन registerAsService के बजाय, C++ में सेवा को LazyServiceRegistrar के साथ रजिस्टर करें. उदाहरण के लिए:
    // only one instance of LazyServiceRegistrar per process
    LazyServiceRegistrar registrar;
    registrar.registerAsService(myHidlService /* , "default" */);
  • पुष्टि करें कि HAL क्लाइंट, टॉप-लेवल HAL (hwservicemanager के साथ रजिस्टर किया गया इंटरफ़ेस) का रेफ़रंस सिर्फ़ तब रखता है, जब उसका इस्तेमाल किया जा रहा हो. अगर यह रेफ़रंस, किसी ऐसी hwbinder थ्रेड पर छोड़ा जाता है जो लगातार चलती रहती है, तो देरी से बचने के लिए क्लाइंट को रेफ़रंस छोड़ने के बाद, IPCThreadState::self()->flushCommands() को भी कॉल करना चाहिए. इससे यह पक्का किया जा सकेगा कि बाइंडर ड्राइवर को रेफ़रंस की संख्या में हुए बदलावों की सूचना मिल गई है.