क्लाइंट-साइड उपयोग

आप एचएएल इंटरफ़ेस से मूल्यों को गतिशील रूप से पढ़ने के लिए सशर्त रूप से संकलित कोड को दोबारा कर सकते हैं। उदाहरण के लिए:

#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
// some code fragment
#endif

फ़्रेमवर्क कोड इसके प्रकार के आधार पर <configstore/Utils.h> में परिभाषित एक उपयुक्त उपयोगिता फ़ंक्शन को कॉल कर सकता है।

कॉन्फिगस्टोर उदाहरण

यह उदाहरण TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS को पढ़ने को दर्शाता है, जिसे कॉन्फिगस्टोर 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 एक डिफ़ॉल्ट मान है जो तब लौटाया जाता है जब HAL कार्यान्वयन कॉन्फ़िगरेशन आइटम के लिए कोई मान निर्दिष्ट नहीं करता है। प्रत्येक फ़ंक्शन दो टेम्पलेट पैरामीटर लेता है:

  • I इंटरफ़ेस वर्ग का नाम है।
  • कॉन्फ़िगरेशन आइटम प्राप्त करने के लिए Func सदस्य फ़ंक्शन पॉइंटर है।

क्योंकि कॉन्फ़िगरेशन मान केवल पढ़ने के लिए है और बदलता नहीं है, उपयोगिता फ़ंक्शन आंतरिक रूप से कॉन्फ़िगरेशन मान को कैश करता है। उसी लिंकिंग यूनिट में कैश्ड मान का उपयोग करके बाद की कॉलों को अधिक कुशलता से सेवित किया जाता है।

कॉन्फिगस्टोर-यूटिल्स का उपयोग करना

कॉन्फिगस्टोर एचएएल को छोटे संस्करण के उन्नयन के लिए आगे संगत होने के लिए डिज़ाइन किया गया है, जिसका अर्थ है कि जब एचएएल को संशोधित किया जाता है और कुछ फ्रेमवर्क कोड नए पेश किए गए आइटम का उपयोग करते हैं, तो /vendor में पुराने छोटे संस्करण के साथ कॉन्फिगस्टोर सेवा का उपयोग अभी भी किया जा सकता है।

आगे की अनुकूलता के लिए, सुनिश्चित करें कि आपका कार्यान्वयन निम्नलिखित दिशानिर्देशों का पालन करता है:

  1. जब केवल पुराने संस्करण की सेवा उपलब्ध हो तो नए आइटम डिफ़ॉल्ट मान का उपयोग करते हैं। उदाहरण:
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. क्लाइंट पहले इंटरफ़ेस का उपयोग करता है जिसमें कॉन्फिगस्टोर आइटम शामिल है। उदाहरण:
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. पुराने संस्करण के इंटरफ़ेस के लिए नए संस्करण की सेवा पुनः प्राप्त की जा सकती है। निम्नलिखित उदाहरण में, यदि स्थापित संस्करण v1_1 है, तो v1_1 सेवा को getService() के लिए वापस किया जाना चाहिए:
    V1_0::IConfig::getService()->v1_0API();
    

जब configstore-utils लाइब्रेरी में एक्सेस फ़ंक्शन का उपयोग कॉन्फिगस्टोर आइटम तक पहुंचने के लिए किया जाता है, तो कार्यान्वयन द्वारा #1 की गारंटी दी जाती है और कंपाइलर त्रुटियों द्वारा #2 की गारंटी दी जाती है। इन कारणों से, हम जहां भी संभव हो configstore-utils उपयोग करने की दृढ़ता से अनुशंसा करते हैं।