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

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

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

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

  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 शामिल करने के लिए ConfigStore साझा लाइब्रेरी और हेडर फ़ाइलों के लिए 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
    
    ये कमांड Android.bp और Android.mk को hardware/interfaces/configstore/1.0 में अपडेट करते हैं।
  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 पासथ्रू मोड के लिए आवश्यक है, जिसका उपयोग ConfigStore द्वारा नहीं किया जाता है।
  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. (वैकल्पिक) एक मेनिफेस्ट प्रविष्टि जोड़ें। यदि यह मौजूद नहीं है, तो ConfigStore के "डिफ़ॉल्ट" इंस्टेंस नाम के लिए डिफ़ॉल्ट। उदाहरण के लिए, 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 पर hal_configstore कॉल करने की अनुमति नहीं है)। उदाहरण के लिए, 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 में उपयुक्त टेम्पलेट फ़ंक्शन का उपयोग करके ConfigStore आइटम तक पहुंचें। उदाहरण के लिए, 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);
    
    इस उदाहरण में, ConfigStore आइटम disableInitBlank पुनर्प्राप्त किया जाता है और एक वेरिएबल में संग्रहीत किया जाता है (उपयोगी जब चर को कई बार एक्सेस करने की आवश्यकता होती है)। ConfigStore से प्राप्त मान को तत्काल टेम्पलेट फ़ंक्शन के अंदर कैश किया जाता है ताकि इसे तत्काल टेम्पलेट फ़ंक्शन पर बाद में कॉल के लिए ConfigStore सेवा से संपर्क किए बिना कैश्ड मान से जल्दी से पुनर्प्राप्त किया जा सके।
  3. Android.mk या Android.bp में ConfigStore और configstore-utils लाइब्रेरी पर निर्भरता जोड़ें। उदाहरण के लिए, system/core/healthd/Android.mk में:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \