Adicionando Classes e Itens do ConfigStore

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

Adicionando classes de interface

Se nenhuma classe de interface for definida para o método de interface que você deseja incluir, você deverá incluir a classe de interface antes de poder incluir os itens associados do ConfigStore.

  1. Crie um arquivo de interface HAL. A versão do ConfigStore é 1.0, portanto defina as interfaces do ConfigStore em hardware/interfaces/configstore/1.0 . Por exemplo, em 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 de cabeçalho para incluir a nova interface HAL. 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
    
    Este comando cria dois arquivos, ChargerConfigs.h e ChargerConfigs.cpp , em 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 ). Esta função é necessária para o modo de passagem 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 ( modulename Configs.cpp ) a LOCAL_SRC_FILES e para mapear sinalizadores de construção 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, use como padrão o nome de instância "padrão" 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 hwbinder para hal_configstore ). Por exemplo, em system/sepolicy/private/healthd.te :
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Adicionando 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. (Os arquivos .hal para 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. Implemente o método nos arquivos de implementação HAL da interface correspondente ( .h e .cpp ). Coloque as implementações padrão em 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();
    }
    

Usando itens do ConfigStore

Para usar um item do 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 em 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 armazenado em uma variável (útil quando a variável precisa ser acessada várias vezes). O valor recuperado do ConfigStore é armazenado em cache dentro da função de modelo instanciada para que possa ser recuperado rapidamente do valor armazenado em cache sem entrar em contato com o serviço ConfigStore para chamadas posteriores à função de modelo instanciada.
  3. Adicione a dependência do ConfigStore e da biblioteca 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) \