डिवाइस के सबसिस्टम की पावर को अक्सर प्रयोगशाला के माहौल में, अलग-अलग स्टेडी-स्टेट स्थितियों के लिए मेज़र और रिकॉर्ड किया जाता है. जैसे, स्क्रीन चालू होने पर या डिवाइस के आइडल पावर स्टेटस में होने पर. यह उन सबसिस्टम के लिए काम करता है जिनमें लगातार बिजली की खपत होती है या ऐसी स्थितियों में जिनका आकलन लैब में आसानी से किया जा सकता है. हालांकि, यह कुछ खास इस्तेमाल के उदाहरणों के लिए काम नहीं करता. जैसे, जब स्क्रीन पर कोई वीडियो चल रहा हो.
IPower.hal 1.0
,
पावर के सुझाव भेजने और सबसिस्टम के स्लीप-स्टेटस मेट्रिक पर इकट्ठा किए गए डेटा की रिपोर्ट करने के लिए इंटरफ़ेस उपलब्ध कराता है.
Android 10 और उसके बाद के वर्शन में, IPowerStats.hal
पावर-स्टेट कलेक्शन एपीआई में, इकट्ठा किए गए आंकड़ों की रिपोर्टिंग करने वाला फ़ंक्शन मौजूद होता है. साथ ही, यह डिवाइस पर ऊर्जा के इस्तेमाल का डेटा वापस पाने का तरीका भी उपलब्ध कराता है. इससे, IPower.hal
इंटरफ़ेस के इकट्ठा किए गए आंकड़ों के हिस्से को बदल दिया जाता है, ताकि फ़ंक्शन को साफ़ तौर पर अलग किया जा सके.
IPowerStats
सेवा की रीडिंग समय-समय पर नहीं होती हैं. ये सूचनाएं अहम पलों पर दिखती हैं. जैसे, बैटरी 1% कम होने पर. बैटरी खर्च होने की दर कम होने पर, रीडिंग कम बार मिलती हैं. वहीं, बैटरी खर्च होने की दर ज़्यादा होने पर, रीडिंग ज़्यादा बार मिलती हैं. डेटा को फिर से सर्वर पर भेजा जा सकता है. साथ ही, विश्लेषण और प्राथमिकता तय करने के लिए, गड़बड़ी की रिपोर्ट में इसका इस्तेमाल किया जा सकता है.
इससे, डिवाइस की बैटरी लाइफ़ बढ़ाने और बिजली की खपत कम करने में मदद मिलती है.
IPower.hal और IPowerStats.hal
Android 10 पर IPower.hal
और
IPowerStats.hal
, दोनों इंटरफ़ेस उपलब्ध हैं. हालांकि, IPower.hal
आंकड़े इकट्ठा करने की सुविधा सिर्फ़ IPowerStats.hal
इंटरफ़ेस से उपलब्ध है. IPowerStats.hal
की सुविधा में, एपीआई शामिल हैं. इनकी मदद से, काम करने वाले डिवाइसों के लिए डिवाइस पर होने वाली बिजली की खपत के डेटा को इकट्ठा किया जा सकता है और उसका इस्तेमाल किया जा सकता है:
- यह कम फ़्रीक्वेंसी (
getRailInfo
) और ज़्यादा फ़्रीक्वेंसी (streamEnergyData
) वाले क्लाइंट, दोनों के लिए रेल-लेवल पर ऊर्जा की माप करता है. साथ ही, यह बूट होने के बाद से इकट्ठा हुई ऊर्जा की जानकारी देता है. - इस रिपोर्ट में, काम करने वाले हर उस
PowerEntity
के बारे में जानकारी होती है जिसके लिए डेटा उपलब्ध है.PowerEntity
एक प्लैटफ़ॉर्म सबसिस्टम, पेरिफ़रल या पावर डोमेन है, जो डिवाइस की कुल पावर खपत पर असर डालता है. - यह उन पावर इकाई की स्थितियों (
getPowerEntityStateInfo
) के सेट की रिपोर्ट करता है जिनके लिए तय की गई इकाइयां, रेज़िडेंसी डेटा उपलब्ध कराती हैं. इसके बाद, यह हर तयPowerEntity
के लिए इकट्ठा किया गया डेटा रिपोर्ट करता है.
IPowerStats.hal
एपीआई का इस्तेमाल इन क्लाइंट करते हैं:
Statsd
, हर रेल की पावर खपत की मेट्रिक इकट्ठा करने के लिए.Perfetto
, ताकि सीपीयू (CPU) की गतिविधि के साथ बिजली की खपत का पता लगाया जा सके.Batterystats
,power_profile.xml.
में पहले से तय किए गए कॉन्स्टेंट से बैटरी खर्च का अनुमान लगाने के बजाय, मेज़र किए गए डेटा का इस्तेमाल करके बैटरी एट्रिब्यूशन को बेहतर बनाने के लिए
Android 10 और उसके बाद के वर्शन में, डिवाइस बनाने वाली कंपनी IPower.hal
और IPowerStats.hal
फ़ंक्शन में से किसी एक को चुन सकती है. हालांकि, अगर IPowerStats.hal
लागू नहीं किया गया है, तो सभी क्लाइंट को IPower.hal
पर स्विच करना होगा.
IPowerStats.hal लागू करने के विकल्प
Android 7 से लेकर Android 9 तक के वर्शन पर सिर्फ़ IPower.hal
फ़ंक्शन उपलब्ध हैं. Android 10 पर अपग्रेड किए गए डिवाइसों में, हार्डवेयर पावर-मॉनिटरिंग सबसिस्टम या पावर के आंकड़ों को मॉनिटर और रिकॉर्ड करने के लिए कोई दूसरा तरीका होना चाहिए. कुछ SoC, आपके लिए बिजली के इस्तेमाल के आंकड़े इकट्ठा करते हैं. इसके अलावा, सॉफ़्टवेयर की मदद से, बिजली की इकाई के स्टेटस की जानकारी भी हासिल की जा सकती है. पावर मॉनिटर करने वाला हार्डवेयर सिर्फ़ getRailInfo()
, getEnergyData()
, और streamEnergyData()
के साथ काम करता है.
अगर पावर मॉनिटर करने वाले हार्डवेयर के बिना IPowerStats.hal
लागू किया जाता है, तो getRailInfo(), getEnergyData()
और streamEnergyData()
NOT_SUPPORTED
दिखाते हैं. इसी तरह, अगर getPowerEntityInfo(), getPowerEntityStateInfo()
और getPowerEntityStateResidencyData()
का इस्तेमाल नहीं किया जाता है, तो ये भी NOT_SUPPORTED
दिखा सकते हैं.
रेलवे ट्रैक की निगरानी करने वाले एपीआई से मिले डेटा के उदाहरणों में ये शामिल हैं
- डिसप्ले के लिए पावर रेल ने X µW का इस्तेमाल किया.
- मॉडम की पावर रेल ने Y µW खर्च किया.
सबसिस्टम के स्लीप-स्टेटस एपीआई से मिले डेटा के उदाहरणों में ये शामिल हैं
- मॉडम X मिलीसेकंड के लिए बंद था.
- SoC, Y मिलीसेकंड के लिए पावर-कॉलप्स स्टेटस में था.
- जीपीयू, Z मिलीसेकंड के लिए निलंबित स्थिति में था.
हार्डवेयर की पावर को मॉनिटर करने वाले सबसिस्टम का इस्तेमाल करना
अगर आपके डिवाइस के डिज़ाइन में, हार्डवेयर की पावर को मॉनिटर करने वाला सबसिस्टम है, तो IPowerStats.hal
को लागू करने के लिए एक sysfs नोड बनाएं. इससे PowerStats.hal
, डेटा को पार्स कर सकता है. इसके अलावा, ioctl टाइप के सिस्टम कॉल का कलेक्शन बनाकर भी IPowerStats.hal
को लागू किया जा सकता है.
आपको अपने कर्नेल ड्राइवर को इस तरह से लागू करना होगा कि इकट्ठा किए गए डेटा की संख्या, इकट्ठा करने की तय सीमा से ज़्यादा न हो. इस्तेमाल किया जाने वाला एल्गोरिदम, आपके यूनीक हार्डवेयर पावर-मॉनिटरिंग सबसिस्टम डिज़ाइन पर निर्भर करता है. यह डिज़ाइन, बस वोल्टेज और करंट के तुरंत और औसत मेज़रमेंट, दोनों उपलब्ध कराना चाहिए. यह ज़रूरी है कि कर्नेल ड्राइवर इस डेटा को इस तरह से कैप्चर करे कि ऊर्जा संचय करने वाले उपकरणों का डेटा मिट न जाए. साथ ही, यह भी ज़रूरी है कि वह बूट होने के बाद से, हर सब-रेल के लिए इकट्ठा की गई ऊर्जा का डेटा बनाए रखे. यह डेटा, 64-बिट वैरिएबल के तौर पर सेव किया जाना चाहिए. यह वैरिएबल, हर ऐक्यूमुलेटर क्वेरी से ऊर्जा की रीडिंग के साथ बढ़ता है.
किसी कॉम्पोनेंट (या वैकल्पिक रूप से, एक से ज़्यादा कॉम्पोनेंट) के आंकड़े, एक ही नोड में होने चाहिए. हालांकि, यह sysfs का सामान्य इस्तेमाल नहीं है, जो आम तौर पर हर नोड को एक ही वैल्यू तक सीमित करता है. इससे यह पक्का होता है कि सारा डेटा एक जैसा हो.
डिज़ाइन से जुड़े दिशा-निर्देश
- sysfs नोड से पढ़ते समय या सिस्टम कॉल करते समय, इंतज़ार का समय कम (ज़्यादा से ज़्यादा 1 मिलीसेकंड) रखें.
- पक्का करें कि आंकड़ों की सुविधा से, डिवाइस की बैटरी का इस्तेमाल बहुत ज़्यादा न हो:
- स्लीप मोड में बिताए गए समय जैसे पैरामीटर को ट्रैक करने के लिए, ऐक्सेस पॉइंट (एपी) और/या सबसिस्टम के 'जागने' की संख्या न बढ़ाएं.
- जब भी संभव हो, ऐप्लिकेशन प्रोसेसर और फ़र्मवेयर के बीच आंकड़ों को ट्रांसफ़र करें. ऐसा करने के लिए, अन्य ट्रैफ़िक का फ़ायदा लें.
- ज़रूरत पड़ने पर, सबसिस्टम इन ड्राइवर फ़ंक्शन का इस्तेमाल कर सकता है:
- थोड़े पुराने डेटा की कीमत पर, इंतज़ार/जागने की अवधि से बचने के लिए, डेटा को अंदरूनी तौर पर कैश मेमोरी में सेव करना.
- सबसिस्टम के बंद होने पर एक्सट्रापोलेशन (अनुमान लगाना) की सुविधा चालू करना, ताकि सबसिस्टम को चालू किए बिना, स्लीप मोड में बिताए गए समय की अपडेट की गई जानकारी दी जा सके.
कॉम्पोनेंट, सबसिस्टम, और आंकड़े चुनना
यह चुनते समय कि किन कॉम्पोनेंट या सबसिस्टम से IPowerStats.hal
डेटा इकट्ठा करना है, डिवाइस पर मौजूद ऐसा कोई भी कॉम्पोनेंट चुनें जो ज़्यादा करंट (5 mA या उससे ज़्यादा) का इस्तेमाल करता हो या जो बिजली की खपत के कई मोड के साथ काम करता हो. जैसे:
- अलग-अलग SoC सबसिस्टम.
- ऐसे सबसिस्टम जो एसओसी के कुछ हिस्से या पूरी तरह से बाहर होते हैं. जैसे, वाई-फ़ाई, इमेज प्रोसेसर या सुरक्षा प्रोसेसर.
- ज़्यादा पावर वाली एलईडी और कैमरे जैसे सहायक डिवाइस.
- अलग-अलग मोड का इस्तेमाल करने वाले पावर डोमेन. जैसे, पूरे SoC के लिए पावर डोमेन.
पसंद के मुताबिक बनाएं
इस सुविधा को पसंद के मुताबिक बनाया जा सकता है. हालांकि, इसका इस्तेमाल करना ज़रूरी नहीं है. इस्तेमाल के उदाहरण डिज़ाइन करें और अपने हिसाब से इस्तेमाल करें:
- यह तय करें कि किन रेल को मेज़र करना है और उन्हें कितनी बार मेज़र करना है.
- यह तय करें कि डेटा कब पढ़ना है और उसका विश्लेषण कैसे करना है.
- अपने डेटा के आधार पर, यह तय करें कि कौनसी कार्रवाई की जाए और कब की जाए.
पुष्टि करें
वीटीएस टेस्ट से यह पक्का होता है कि Android की ज़रूरी शर्तें पूरी की गई हैं. IPowerStats.hal
में मौजूद टिप्पणियों का इस्तेमाल, इस बात की पुष्टि करने के लिए किया जाता है कि कोई डिवाइस नीति का पालन करता है या नहीं.
उदाहरण के लिए, अगर getRailInfo()
को कॉल करने पर कोई जानकारी नहीं मिलती है, तो वीटीएस टेस्ट पूरा नहीं होता. ऐसा इसलिए होता है, क्योंकि आपको मॉनिटर की गई रेल के बारे में जानकारी नहीं मिलती या SUCCESS
का स्टेटस मिलता है. इसी तरह, अगर आपको रेल की जानकारी मिली है, लेकिन उसके साथ NON_SUPPORTED
या FILE_SYSTEM_ERROR
जवाब मिला है, तो यह भी गड़बड़ी है. VTS, IPower.hal और IPowerStats.hal टिप्पणियों में दी गई ज़रूरी शर्तों का इस्तेमाल करके, यह पुष्टि करता है कि डिवाइस मैन्युफ़ैक्चरर की खास बातों का पालन, HAL फ़ाइल में किया गया है या नहीं. यहां, वीटीएस टेस्टिंग में इस्तेमाल की गई टिप्पणियों का उदाहरण दिया गया है:
/** * Rail information: * Reports information related to the rails being monitored. * * @return rails Information about monitored rails. * @return status SUCCESS on success or NOT_SUPPORTED if * feature is not enabled or FILESYSTEM_ERROR on filesystem nodes * access error. */ getRailInfo() generates(vec<e;RailInfo>e; rails, Status status);