गतिशील रूप से उपलब्ध एचएएल

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

डायनेमिक शटडाउन को लागू करने में डेटा प्रवाह को व्यवस्थित करना और डायनेमिक प्रक्रियाओं को निष्पादित करना शामिल है जैसा कि निम्नलिखित अनुभागों में बताया गया है।

एचएएल परिभाषाओं में परिवर्तन

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

# 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 को बताने की भी आवश्यकता होती है। एंड्रॉइड 9 में, init में तीन अतिरिक्त नियंत्रण संदेश शामिल हैं (जैसे ctl.start ): ctl.interface_start , ctl.interface_stop , और ctl.interface_restart । इन संदेशों का उपयोग विशिष्ट हार्डवेयर इंटरफ़ेस को ऊपर और नीचे लाने के लिए init संकेत देने के लिए किया जा सकता है। जब किसी सेवा का अनुरोध किया जाता है और वह पंजीकृत नहीं होती है, तो hwservicemanager अनुरोध करता है कि सेवा शुरू की जाए। हालाँकि, गतिशील एचएएल को इनमें से किसी का उपयोग करने की आवश्यकता नहीं है।

एचएएल निकास का निर्धारण करें

एंड्रॉइड 9 में, एचएएल निकास को मैन्युअल रूप से निर्धारित करना होगा। एंड्रॉइड 10 और उच्चतर के लिए, इसे स्वचालित जीवनचक्र के साथ भी निर्धारित किया जा सकता है।

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

  • यदि कोई व्यक्ति उस पर क्लोज़ या समान एपीआई कॉल करता है तो एचएएल स्वयं ही एग्ज़िट कॉल करना चुन सकता है। यह व्यवहार संबंधित HAL इंटरफ़ेस में निर्दिष्ट किया जाना चाहिए।
  • जब उनका कार्य पूरा हो जाता है तो एचएएल बंद हो सकते हैं (एचएएल फ़ाइल में प्रलेखित)।

स्वचालित जीवनचक्र

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

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