आप एचएएल इंटरफेस से गतिशील रूप से मूल्यों को पढ़ने के लिए सशर्त रूप से संकलित कोड को दोबारा कर सकते हैं। उदाहरण के लिए:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS //some code fragment #endif
फिर फ्रेमवर्क कोड इसके प्रकार के आधार पर <configstore/Utils.h>
में परिभाषित एक उपयुक्त उपयोगिता फ़ंक्शन को कॉल कर सकता है।
कॉन्फिगस्टोर उदाहरण
यह उदाहरण TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
पढ़ने को दिखाता है, जिसे ConfigStore HAL में forceHwcForVirtualDisplays()
रिटर्न टाइप OptionalBool
Bool के रूप में परिभाषित किया गया है:
#include <configstore/Utils.h> using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static bool vsyncPhaseOffsetNs = getBool<ISurfaceFlingerConfigs, ISurfaceFlingerConfigs::forceHwcForVirtualDisplays>(false);
उपयोगिता फ़ंक्शन (उपरोक्त उदाहरण में getBool
) इंटरफ़ेस फ़ंक्शन के प्रॉक्सी के लिए हैंडल प्राप्त करने के लिए configstore
सेवा से संपर्क करता है, फिर HIDL/hwbinder के माध्यम से हैंडल को कॉल करके मान प्राप्त करता है।
उपयोगिता कार्य
<configstore/Utils.h>
( configstore/1.0/include/configstore/Utils.h
) प्रत्येक आदिम रिटर्न प्रकार के लिए उपयोगिता कार्य प्रदान करता है, जिसमें Optional[Bool|String|Int32|UInt32|Int64|UInt64]
शामिल है, जैसा कि नीचे सूचीबद्ध है:
टाइप | फ़ंक्शन (टेम्पलेट पैरामीटर छोड़े गए) |
---|---|
OptionalBool | bool getBool(const bool defValue) |
OptionalInt32 | int32_t getInt32(const int32_t defValue) |
OptionalUInt32 | uint32_t getUInt32(const uint32_t defValue) |
OptionalInt64 | int64_t getInt64(const int64_t defValue) |
OptionalUInt64 | uint64_t getUInt64(const uint64_t defValue) |
OptionalString | std::string getString(const std::string &defValue) |
defValue
एक डिफ़ॉल्ट मान है, जब HAL कार्यान्वयन कॉन्फ़िगरेशन आइटम के लिए कोई मान निर्दिष्ट नहीं करता है। प्रत्येक फ़ंक्शन दो टेम्पलेट पैरामीटर लेता है:
-
I
इंटरफ़ेस वर्ग का नाम है। -
Func
कॉन्फ़िगरेशन आइटम प्राप्त करने के लिए सदस्य फ़ंक्शन पॉइंटर है।
क्योंकि कॉन्फ़िगरेशन मान केवल-पढ़ने के लिए है और बदलता नहीं है, उपयोगिता फ़ंक्शन आंतरिक रूप से कॉन्फ़िगरेशन मान को कैश करता है। बाद की कॉलों को उसी लिंकिंग इकाई में कैश्ड मान का उपयोग करके अधिक कुशलता से सेवित किया जाता है।
configstore-utils का उपयोग करना
कॉन्फिगस्टोर एचएएल को मामूली संस्करण उन्नयन के लिए आगे संगत होने के लिए डिज़ाइन किया गया है, जिसका अर्थ है कि जब एचएएल को संशोधित किया जाता है और कुछ फ्रेमवर्क कोड नए पेश किए गए आइटम का उपयोग करते हैं, तो कॉन्फिगस्टोर सेवा /vendor
में पुराने मामूली संस्करण के साथ अभी भी उपयोग किया जा सकता है।
आगे की संगतता के लिए, सुनिश्चित करें कि आपका कार्यान्वयन निम्नलिखित दिशानिर्देशों का पालन करता है:
- केवल पुराने संस्करण की सेवा उपलब्ध होने पर नए आइटम डिफ़ॉल्ट मान का उपयोग करते हैं। उदाहरण:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
3 - क्लाइंट पहले इंटरफ़ेस का उपयोग करता है जिसमें ConfigStore आइटम शामिल था। उदाहरण:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
4 - पुराने संस्करण के इंटरफ़ेस के लिए नए संस्करण की सेवा को पुनः प्राप्त किया जा सकता है। निम्नलिखित उदाहरण में, यदि स्थापित संस्करण v1_1 है, तो v1_1 सेवा को
getService()
:V1_0::IConfig::getService()->v1_0API();
के लिए वापस किया जाना चाहिए
जब configstore-utils
लाइब्रेरी में एक्सेस फ़ंक्शन का उपयोग कॉन्फिगस्टोर आइटम तक पहुंचने के लिए किया जाता है, तो # 1 को कार्यान्वयन की गारंटी दी जाती है और # 2 को कंपाइलर त्रुटियों की गारंटी दी जाती है। इन कारणों से, हम जहां भी संभव हो, configstore-utils
का उपयोग करने की दृढ़ता से अनुशंसा करते हैं।