कॉन्फिगस्टोर कक्षाएं और आइटम जोड़ना

आप मौजूदा इंटरफ़ेस क्लास के लिए नए कॉन्फ़िगस्टोर आइटम (यानी, इंटरफ़ेस विधियाँ) जोड़ सकते हैं। यदि इंटरफ़ेस क्लास परिभाषित नहीं है, तो आपको उस क्लास के लिए कॉन्फिगस्टोर आइटम जोड़ने से पहले एक नई क्लास जोड़नी होगी। यह अनुभाग IChargerConfigs इंटरफ़ेस वर्ग में जोड़े जाने वाले healthd के लिए एक disableInitBlank कॉन्फ़िगरेशन आइटम के उदाहरण का उपयोग करता है।

इंटरफ़ेस कक्षाएं जोड़ना

यदि इंटरफ़ेस विधि के लिए कोई इंटरफ़ेस क्लास परिभाषित नहीं है जिसे आप जोड़ना चाहते हैं, तो संबंधित कॉन्फिगस्टोर आइटम जोड़ने से पहले आपको इंटरफ़ेस क्लास जोड़ना होगा।

  1. एक HAL इंटरफ़ेस फ़ाइल बनाएँ। कॉन्फिगस्टोर संस्करण 1.0 है, इसलिए कॉन्फिगस्टोर इंटरफेस को hardware/interfaces/configstore/1.0 में परिभाषित करें। उदाहरण के लिए, hardware/interfaces/configstore/1.0/IChargerConfigs.hal में:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. नए इंटरफ़ेस HAL को शामिल करने के लिए कॉन्फ़िगस्टोर साझा लाइब्रेरी और हेडर फ़ाइलों के लिए Android.bp और Android.mk को अपडेट करें। उदाहरण के लिए:
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Lmakefile -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    
    ये कमांड hardware/interfaces/configstore/1.0 में Android.bp और Android.mk अपडेट करते हैं।
  3. सर्वर कोड लागू करने के लिए C++ स्टब जेनरेट करें। उदाहरण के लिए:
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    
    यह कमांड hardware/interfaces/configstore/1.0/default में दो फाइलें, ChargerConfigs.h और ChargerConfigs.cpp बनाता है।
  4. .h और .cpp कार्यान्वयन फ़ाइलें खोलें और फ़ंक्शन HIDL_FETCH_ name से संबंधित कोड हटा दें (उदाहरण के लिए, HIDL_FETCH_IChargerConfigs )। यह फ़ंक्शन HIDL पासथ्रू मोड के लिए आवश्यक है, जिसका उपयोग कॉन्फिगस्टोर द्वारा नहीं किया जाता है।
  5. कार्यान्वयन को कॉन्फिगस्टोर सेवा में पंजीकृत करें। उदाहरण के लिए, hardware/interfaces/configstore/1.0/default/service.cpp में:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include "ChargerConfigs.h"
    
    using android::hardware::configstore::V1_0::IChargerConfigs;
    using android::hardware::configstore::V1_0::implementation::ChargerConfigs;
    
    int main() {
        ... // other code
        sp<IChargerConfigs> chargerConfigs = new ChargerConfigs;
        status = chargerConfigs->registerAsService();
        LOG_ALWAYS_FATAL_IF(status != OK, "Could not register IChargerConfigs");
        ... // other code
    }
    
  6. कार्यान्वयन फ़ाइल ( modulename Configs.cpp ) को LOCAL_SRC_FILES में जोड़ने और बिल्ड फ़्लैग को मैक्रो परिभाषाओं में मैप करने के लिए Android.mk फ़ाइल को संशोधित करें। उदाहरण के लिए, hardware/interfaces/configstore/1.0/default/Android.mk में:
    LOCAL_SRC_FILES += ChargerConfigs.cpp
    
    ifeq ($(strip $(BOARD_CHARGER_DISABLE_INIT_BLANK)),true)
    LOCAL_CFLAGS += -DCHARGER_DISABLE_INIT_BLANK
    endif
    
  7. (वैकल्पिक) एक मेनिफेस्ट प्रविष्टि जोड़ें। यदि यह मौजूद नहीं है, तो कॉन्फ़िगस्टोर के "डिफ़ॉल्ट" इंस्टेंस नाम को डिफ़ॉल्ट करें। उदाहरण के लिए, device/google/marlin/manifest.xml में:
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. यदि आवश्यक हो तो सेपॉलिसी नियम जोड़ें (अर्थात्, यदि क्लाइंट के पास hal_configstore पर hwbinder कॉल करने की अनुमति नहीं है)। उदाहरण के लिए, system/sepolicy/private/healthd.te में:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

नए कॉन्फिगस्टोर आइटम जोड़े जा रहे हैं

एक नया कॉन्फिगस्टोर आइटम जोड़ने के लिए:

  1. एचएएल फ़ाइल खोलें और आइटम के लिए आवश्यक इंटरफ़ेस विधि जोड़ें। (कॉन्फ़िगस्टोर के लिए .hal फ़ाइलें hardware/interfaces/configstore/1.0 में रहती हैं।) उदाहरण के लिए, hardware/interfaces/configstore/1.0/IChargerConfigs.hal में:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. विधि को संबंधित इंटरफ़ेस HAL कार्यान्वयन फ़ाइलों ( .h और .cpp ) में लागू करें। डिफ़ॉल्ट कार्यान्वयन को hardware/interfaces/configstore/1.0/default में रखें। उदाहरण के लिए, hardware/interfaces/configstore/1.0/default/ChargerConfigs.h में:
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    और hardware/interfaces/configstore/1.0/default/ChargerConfigs.cpp में:
    Return<void> ChargerConfigs::disableInitBlank(disableInitBlank_cb _hidl_cb) {
        bool value = false;
    #ifdef CHARGER_DISABLE_INIT_BLANK
        value = true;
    #endif
        _hidl_cb({true, value});
        return Void();
    }
    

कॉन्फिगस्टोर आइटम का उपयोग करना

कॉन्फ़िगस्टोर आइटम का उपयोग करने के लिए:

  1. आवश्यक हेडर फ़ाइलें शामिल करें. उदाहरण के लिए, system/core/healthd/healthd.cpp में:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. android.hardware.configstore-utils में उपयुक्त टेम्पलेट फ़ंक्शन का उपयोग करके कॉन्फिगस्टोर आइटम तक पहुंचें। उदाहरण के लिए, system/core/healthd/healthd.cpp में:
    using namespace android::hardware::configstore;
    using namespace android::hardware::configstore::V1_0;
    
    static int64_t disableInitBlank = getBool<
            IChargerConfigs,
            &IChargerConfigs::disableInitBlank>(false);
    
    इस उदाहरण में, कॉन्फिगस्टोर आइटम disableInitBlank को पुनर्प्राप्त किया जाता है और एक वेरिएबल में संग्रहीत किया जाता है (उपयोगी जब वेरिएबल को कई बार एक्सेस करने की आवश्यकता होती है)। कॉन्फिगस्टोर से प्राप्त मूल्य को इंस्टेंटियेटेड टेम्पलेट फ़ंक्शन के अंदर कैश किया जाता है ताकि इसे इंस्टेंटियेटेड टेम्पलेट फ़ंक्शन पर बाद में कॉल के लिए कॉन्फिगस्टोर सेवा से संपर्क किए बिना कैश्ड वैल्यू से तुरंत पुनर्प्राप्त किया जा सके।
  3. Android.mk या Android.bp में कॉन्फिगस्टोर और configstore-utils लाइब्रेरी पर निर्भरता जोड़ें। उदाहरण के लिए, system/core/healthd/Android.mk में:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \