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, o sınıfa ConfigStore öğesi ekleyebilmeniz için önce yeni bir sınıf eklemeniz gerekir. Bu bölümde, healthd için IChargerConfigs arabirim sınıfına eklenen bir disableInitBlank yapılandırma öğesi örneğini kullanır.

Arayüz sınıfları ekleme

Eklemek istediğiniz arayüz yöntemi için herhangi bir arayüz sınıfı tanımlanmamışsa, ilişkili ConfigStore öğelerini ekleyebilmeniz 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'dır, bu nedenle ConfigStore arayüzlerini hardware/interfaces/configstore/1.0 içinde tanımlayın. Örneğin, hardware/interfaces/configstore/1.0/IChargerConfigs.hal dosyasında:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. ConfigStore paylaşılan kitaplığı ve başlık dosyaları için yeni HAL arayüzünü içerecek şekilde Android.bp ve Android.mk 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 dosyasındaki Android.bp ve Android.mk 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 konumunda 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 kaldırın (örneğin, HIDL_FETCH_IChargerConfigs ). 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 dosyasında:
    #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ı ( modulename Configs.cpp ) LOCAL_SRC_FILES eklemek ve yapı bayraklarını makro tanımlarıyla 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ı) Bir bildirim girişi ekleyin. Mevcut değilse, varsayılan olarak ConfigStore'un "varsayılan" örnek adını kullanın. Örneğin, device/google/marlin/manifest.xml dosyasında:
        <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 hwbinder çağrıları yapma izni yoksa). Örneğin, system/sepolicy/private/healthd.te :
    ... // 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 için .hal dosyaları hardware/interfaces/configstore/1.0 konumunda bulunur.) Örneğin, hardware/interfaces/configstore/1.0/IChargerConfigs.hal konumunda:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Yöntemi ilgili arayüz HAL uygulama dosyalarına ( .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;
    };
    
    Ve 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

Bir ConfigStore öğesini 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çindeki uygun şablon işlevini kullanarak ConfigStore öğesine erişin. Örneğin, system/core/healthd/healthd.cpp dosyasında:
    using namespace android::hardware::configstore;
    using namespace android::hardware::configstore::V1_0;
    
    static int64_t disableInitBlank = getBool<
            IChargerConfigs,
            &IChargerConfigs::disableInitBlank>(false);
    
    Bu örnekte, ConfigStore disableInitBlank alınır ve bir değişkende depolanır (değişkene birden çok kez erişilmesi gerektiğinde kullanışlıdır). ConfigStore'dan alınan değer, somutlaştırılmış şablon işlevi içinde önbelleğe alınır; böylece, daha sonra örneklenmiş şablon işlevine yapılan çağrılar için ConfigStore hizmetiyle iletişime geçmeden, önbelleğe alınmış değerden hızlı bir şekilde alınabilir.
  3. Bağımlılığı ConfigStore'a ve Android.mk veya Android.bp configstore-utils kitaplığına ekleyin. Örneğin, system/core/healthd/Android.mk :
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \