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

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

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

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

  1. HAL इंटरफ़ेस की कोई फ़ाइल बनाएं. ConfigStore का वर्शन 1.0 है. इसलिए, ConfigStore के इंटरफ़ेस को 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. ConfigStore की शेयर की गई लाइब्रेरी और हेडर फ़ाइलों के लिए, Android.bp और Android.mk को अपडेट करें, ताकि उनमें इंटरफ़ेस का नया HAL शामिल किया जा सके. उदाहरण के लिए:
    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. Android.mk फ़ाइल में बदलाव करें, ताकि लागू करने वाली फ़ाइल (modulenameConfigs.cpp) को LOCAL_SRC_FILES में जोड़ा जा सके. साथ ही, बिल्ड फ़्लैग को मैक्रो डेफ़िनिशन में मैप किया जा सके. उदाहरण के लिए, 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. ज़रूरत पड़ने पर, sepolicy का नियम जोड़ें. जैसे, अगर क्लाइंट के पास 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. इंटरफ़ेस के 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();
    }
    

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