डाइनैमिक रूप से उपलब्ध एचएएल

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है Android 9 पर, Android हार्डवेयर को डाइनैमिक तरीके से बंद किया जा सकता है सबसिस्टम, जब उनका इस्तेमाल न किया जा रहा हो या उनकी ज़रूरत न हो. उदाहरण के लिए, जब कोई उपयोगकर्ता वाई-फ़ाई का उपयोग नहीं किया जा रहा है, तो वाई-फ़ाई सबसिस्टम को मेमोरी नहीं लेनी चाहिए, या अन्य सिस्टम संसाधनों का उपयोग कर रहे हैं. Android के पुराने वर्शन में, HAL/ड्राइवर 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 अनुरोध करता है कि सेवा शुरू किया गया. हालांकि, डाइनैमिक एचएएल को इनमें से किसी का भी इस्तेमाल करने की ज़रूरत नहीं होती.

HAL निकास का पता लगाएं

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

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

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

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

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

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