वैल्यू को डाइनैमिक तौर पर पढ़ने के लिए, शर्तों के साथ कंपाइल किए गए कोड को रीफ़ैक्टर किया जा सकता है HAL इंटरफ़ेस में कॉपी करने की ज़रूरत नहीं है. उदाहरण के लिए:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
इसके बाद, फ़्रेमवर्क कोड यहां बताए गए यूटिलिटी फ़ंक्शन को कॉल कर सकता है
<configstore/Utils.h>
के टाइप के आधार पर.
ConfigStore का उदाहरण
इस उदाहरण में बताया गया है कि
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
, ConfigStore HAL में तय किया गया है
रिटर्न टाइप के साथ forceHwcForVirtualDisplays()
के तौर पर
OptionalBool
:
#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
एक डिफ़ॉल्ट वैल्यू होती है
कॉन्फ़िगरेशन आइटम के लिए कोई मान तय नहीं करता है. हर फ़ंक्शन को प्रोसेस करने में दो
टेंप्लेट पैरामीटर:
I
, इंटरफ़ेस क्लास का नाम है.Func
, मेंबर फ़ंक्शन पॉइंटर है कॉन्फ़िगरेशन आइटम प्राप्त किया जा रहा है.
कॉन्फ़िगरेशन वैल्यू रीड-ओनली होती है और उसमें बदलाव नहीं होता. इसलिए, यह यूटिलिटी फ़ंक्शन, कॉन्फ़िगरेशन वैल्यू को अंदरूनी तौर पर कैश मेमोरी में सेव करता है. बाद के कॉल ये हैं कैश मेमोरी में सेव की गई वैल्यू का इस्तेमाल करके, ज़्यादा बेहतर तरीके से सर्विस की जाती है.
configstore-utils का इस्तेमाल करें
ConfigStore HAL को इस तरह से डिज़ाइन किया गया है कि यह माइनर वर्शन के साथ काम कर सके
अपग्रेड का मतलब है कि जब एचएएल में बदलाव किया जाता है और कुछ फ़्रेमवर्क कोड होते हैं,
नए आइटम का उपयोग करता है, एक बड़े नाबालिग के साथ ConfigStore सेवा
/vendor
के वर्शन को अब भी इस्तेमाल किया जा सकता है.
आगे साथ में काम करने के लिए, पक्का करें कि लागू करने की प्रक्रिया ये दिशा-निर्देश:
- नए आइटम डिफ़ॉल्ट मान का इस्तेमाल तब करते हैं, जब सिर्फ़ पुराने वर्शन की सेवा का इस्तेमाल किया जा रहा हो
उपलब्ध है. उदाहरणः
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है - क्लाइंट पहले इंटरफ़ेस का इस्तेमाल करता है, जिसमें ConfigStore आइटम शामिल है.
उदाहरणः
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है - नए वर्शन की सेवा को पुराने वर्शन के इंटरफ़ेस के लिए वापस पाया जा सकता है. तय सीमा में
नीचे दिए गए उदाहरण में, अगर इंस्टॉल किया गया वर्शन v1_1 है, तो v1_1 सेवा को
getService()
का किराया वापस किया जाएगा:V1_0::IConfig::getService()->v1_0API();
जब configstore-utils
लाइब्रेरी में मौजूद ऐक्सेस फ़ंक्शन ये होते हैं
इसका इस्तेमाल ConfigStore आइटम को ऐक्सेस करने के लिए किया जाता है, तो लागू करने से #1 की गारंटी मिलती है
और #2 की गारंटी कंपाइलर गड़बड़ियों से होती है. इन वजहों से, हम
हमारा सुझाव है कि जहां भी हो सके, configstore-utils
का इस्तेमाल करें.