ConfigStore sınıfları ve öğeleri ekleme

Mevcut bir arayüz sınıfı için yeni ConfigStore öğeleri (yani arayüz yöntemleri) ekleyebilirsiniz. Arayüz sınıfı tanımlanmamışsa bu sınıfa ait bir ConfigStore öğesi ekleyebilmek için önce yeni bir sınıf eklemeniz gerekir. Bu bölümde, IChargerConfigs arayüz sınıfına eklenen healthd için disableInitBlank yapılandırma öğesi örneği kullanılmaktadır.

Arayüz sınıfları ekleme

Eklemek istediğiniz arayüz yöntemi için arayüz sınıfı tanımlanmamışsa ilişkili ConfigStore öğelerini ekleyebilmek için önce arayüz sınıfını eklemeniz gerekir.

  1. Bir HAL arayüzü dosyası oluşturun. ConfigStore sürümü 1.0 olduğundan hardware/interfaces/configstore/1.0 içinde ConfigStore arayüzlerini tanımlayın. Örneğin, hardware/interfaces/configstore/1.0/IChargerConfigs.hal içinde:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Yeni arayüz HAL'sini eklemek için ConfigStore paylaşılan kitaplığı ve başlık dosyaları için Android.bp ve Android.mk değerlerini güncelleyin. Örneğin:
    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
    
    Bu komutlar, hardware/interfaces/configstore/1.0 içinde Android.bp ve Android.mk değerlerini günceller.
  3. Sunucu kodunu uygulamak için C++ saplamasını oluşturun. Örneğin:
    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
    
    Bu komut, hardware/interfaces/configstore/1.0/default içinde ChargerConfigs.h ve ChargerConfigs.cpp olmak üzere iki dosya oluşturur.
  4. .h ve .cpp uygulama dosyalarını açın ve HIDL_FETCH_name işleviyle ilgili kodu (örneğin, HIDL_FETCH_IChargerConfigs) kaldırın. Bu işlev, ConfigStore tarafından kullanılmayan HIDL geçiş modu için gereklidir.
  5. Uygulamayı ConfigStore hizmetine kaydedin. Örneğin, 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. Uygulama dosyasını (modulenameConfigs.cpp) LOCAL_SRC_FILES'ye eklemek ve derleme işaretlerini makro tanımlarına eşlemek için Android.mk dosyasını değiştirin. Örneğin, 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. (İsteğe bağlı) Manifest girişi ekleyin. Yoksa ConfigStore'un "varsayılan" örnek adını kullanın. Örneğin, device/google/marlin/manifest.xml:
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. Gerekirse sepolicy kuralını ekleyin (yani istemcinin hal_configstore için hwbinder çağrıları yapma izni yoksa). Örneğin, system/sepolicy/private/healthd.te içinde:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Yeni ConfigStore öğeleri ekleme

Yeni bir ConfigStore öğesi eklemek için:

  1. HAL dosyasını açın ve öğe için gerekli arayüz yöntemini ekleyin. (ConfigStore'a ait .hal dosyaları hardware/interfaces/configstore/1.0 içinde bulunur.) Örneğin, hardware/interfaces/configstore/1.0/IChargerConfigs.hal içinde:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Yöntemi, ilgili arayüz HAL uygulama dosyalarında (.h ve .cpp) uygulayın. Varsayılan uygulamaları hardware/interfaces/configstore/1.0/default içine yerleştirin. Örneğin, hardware/interfaces/configstore/1.0/default/ChargerConfigs.h:
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    Ayrıca 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 öğelerini kullanma

ConfigStore öğesi kullanmak için:

  1. Gerekli başlık dosyalarını ekleyin. Örneğin, system/core/healthd/healthd.cpp:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. android.hardware.configstore-utils içinde uygun şablon işlevini kullanarak ConfigStore öğesine erişin. Örneğin, 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);
    
    Bu örnekte, ConfigStore öğesi disableInitBlank alınır ve bir değişkende depolanır (değişkene birden fazla kez erişilmesi gerektiğinde kullanışlıdır). ConfigStore'dan alınan değer, oluşturulan şablon işlevinin içinde önbelleğe alınır. Böylece, oluşturulan şablon işlevinin sonraki çağrıları için ConfigStore hizmetine başvurmadan önbelleğe alınmış değerden hızlıca alınabilir.
  3. ConfigStore'a ve configstore-utils kitaplığına Android.mk veya Android.bp bağımlılığını ekleyin. Örneğin, system/core/healthd/Android.mk:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \