ConfigStore क्लास और आइटम जोड़ें

किसी मौजूदा इंटरफ़ेस क्लास के लिए, नए ConfigStore आइटम यानी इंटरफ़ेस के तरीके जोड़े जा सकते हैं. अगर इंटरफ़ेस क्लास तय नहीं की गई है, तो उस क्लास के लिए ConfigStore आइटम जोड़ने से पहले आपको एक नई क्लास जोड़नी होगी. इस सेक्शन में, healthd के लिए disableInitBlank कॉन्फ़िगरेशन आइटम के उदाहरण का इस्तेमाल किया गया है. इसे IChargerConfigs इंटरफ़ेस क्लास में जोड़ा जा रहा है.

इंटरफ़ेस क्लास जोड़ें

अगर आपको जो इंटरफ़ेस तरीका जोड़ना है उसके लिए कोई इंटरफ़ेस क्लास तय नहीं की गई है, तो उससे जुड़े ConfigStore आइटम जोड़ने से पहले आपको इंटरफ़ेस क्लास जोड़नी होगी.

  1. एक HAL इंटरफ़ेस फ़ाइल बनाएं. ConfigStore का वर्शन 1.0 है, इसलिए hardware/interfaces/configstore/1.0 में ConfigStore इंटरफ़ेस तय करें. उदाहरण के लिए, 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
    
    ये निर्देश, 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 पासथ्रू मोड के लिए ज़रूरी है, जिसका इस्तेमाल ConfigStore नहीं करता.
  5. ConfigStore सेवा में लागू करने की प्रक्रिया को रजिस्टर करें. उदाहरण के लिए, 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. लागू करने वाली फ़ाइल (modulenameConfigs.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 को hwbinder की मदद से कॉल करने की अनुमतियां नहीं हैं). उदाहरण के लिए, system/sepolicy/private/healthd.te में:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

नए ConfigStore आइटम जोड़ें

नया ConfigStore आइटम जोड़ने के लिए:

  1. HAL फ़ाइल खोलें और आइटम के लिए ज़रूरी इंटरफ़ेस तरीका जोड़ें. (ConfigStore की .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. इस तरीके को, इससे जुड़े इंटरफ़ेस एचएएल लागू करने वाली फ़ाइलों (.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();
    }
    

ConfigStore आइटम का इस्तेमाल करें

ConfigStore आइटम का इस्तेमाल करने के लिए:

  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) \