Adicionar classes e itens do ConfigStore

É possível adicionar novos itens do ConfigStore (ou seja, métodos de interface) a uma classe de interface existente. Se a classe de interface não estiver definida, você deverá adicionar um nova classe antes de adicionar um item ConfigStore a essa classe. Esta seção usa o exemplo de um item de configuração disableInitBlank para healthd sendo adicionado à interface IChargerConfigs .

Adicionar classes de interface

Se nenhuma classe de interface estiver definida para o método de interface que você quer adicionar, você deve adicionar a classe de interface antes de adicionar a ConfigStore.

  1. Crie um arquivo de interface HAL. Como a versão do ConfigStore é 1.0, defina ConfigStore em hardware/interfaces/configstore/1.0. Para exemplo, no hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Atualize Android.bp e Android.mk para a Biblioteca compartilhada do ConfigStore e arquivos principais para incluir a nova HAL de interface. Por exemplo:
    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
    
    Esses comandos atualizam Android.bp e Android.mk em hardware/interfaces/configstore/1.0.
  3. Gere o stub C++ para implementar o código do servidor. Por exemplo:
    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
    
    Esse comando cria dois arquivos, ChargerConfigs.h e ChargerConfigs.cpp, pol. hardware/interfaces/configstore/1.0/default.
  4. Abra os arquivos de implementação .h e .cpp e remova o código relacionado à função HIDL_FETCH_name (por exemplo, HIDL_FETCH_IChargerConfigs). Essa função é necessária para Modo de passagem de HIDL, que não é usado pelo ConfigStore.
  5. Registre a implementação no serviço ConfigStore. Por exemplo, em 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. Modifique o arquivo Android.mk para adicionar o arquivo de implementação. (modulenameConfigs.cpp) para LOCAL_SRC_FILES e mapear flags de build em definições de macro. Por exemplo, em 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. (Opcional) Adicione uma entrada de manifesto. Se não existir, o padrão é o "padrão" e o nome da instância do ConfigStore. Por exemplo, em device/google/marlin/manifest.xml:
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. Adicione a regra sepolicy se necessário (ou seja, se o cliente não tiver permissões para fazer chamadas de hwbinder para hal_configstore). Para exemplo, em system/sepolicy/private/healthd.te:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Adicionar novos itens do ConfigStore

Para adicionar um novo item do ConfigStore:

  1. Abra o arquivo HAL e adicione o método de interface necessário para o item. O Os arquivos .hal do ConfigStore residem em hardware/interfaces/configstore/1.0. Por exemplo, em hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Implementar o método nos arquivos de implementação de HAL da interface correspondentes (.h e .cpp). Coloque as implementações padrão hardware/interfaces/configstore/1.0/default Por exemplo, em hardware/interfaces/configstore/1.0/default/ChargerConfigs.h:
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    E em 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();
    }
    

Usar itens do ConfigStore

Para usar um item ConfigStore:

  1. Inclua os arquivos de cabeçalho necessários. Por exemplo, em system/core/healthd/healthd.cpp:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Acesse o item ConfigStore usando a função de modelo apropriada no android.hardware.configstore-utils: Por exemplo, em 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);
    
    Neste exemplo, o item disableInitBlank do ConfigStore é recuperado e armazenadas em uma variável (útil quando a variável precisar ser acessada por diversos vezes). O valor recuperado do ConfigStore é armazenado em cache função de modelo instanciada para que ela possa ser recuperada rapidamente do valor armazenado em cache sem contatar o serviço ConfigStore para chamadas posteriores ao função de modelo instanciado.
  3. Adicionar a dependência ao ConfigStore e ao configstore-utils em Android.mk ou Android.bp. Por exemplo, em system/core/healthd/Android.mk:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \