É possível adicionar novos itens da ConfigStore (ou seja, métodos de interface) para uma
classe de interface existente. Se a classe de interface não estiver definida, será necessário adicionar uma
nova classe antes de adicionar um item ConfigStore para ela. Esta seção
usa o exemplo de um item de configuração disableInitBlank
para
healthd
sendo adicionado à classe de interface
IChargerConfigs
.
Adicionar classes de interface
Se nenhuma classe de interface estiver definida para o método de interface que você quer adicionar, adicione a classe de interface antes de adicionar os itens de ConfigStore associados.
- 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, emhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- Atualização de
Android.bp
eAndroid.mk
para a biblioteca compartilhada e os arquivos de cabeçalho do ConfigStore para incluir a nova HAL da 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
Android.bp
eAndroid.mk
emhardware/interfaces/configstore/1.0
. - 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
eChargerConfigs.cpp
, emhardware/interfaces/configstore/1.0/default
. - Abra os arquivos de implementação
.h
e.cpp
e remova o código relacionado à funçãoHIDL_FETCH_name
(por exemplo,HIDL_FETCH_IChargerConfigs
). Essa função é necessária para o modo de passagem HIDL, que não é usado pelo ConfigStore. - 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 }
- Modifique o arquivo
Android.mk
para adicionar o arquivo de implementação (modulenameConfigs.cpp
) aLOCAL_SRC_FILES
e mapear flags de build em definições de macro. Por exemplo, emhardware/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
- (Opcional) Adicione uma entrada de manifesto. Se ele não existir, o padrão será 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>
- 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
). Por exemplo, emsystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Adicionar novos itens do ConfigStore
Para adicionar um novo item do ConfigStore:
- Abra o arquivo HAL e adicione o método de interface necessário para o item. Os
arquivos
.hal
do ConfigStore ficam emhardware/interfaces/configstore/1.0
. Por exemplo, emhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- Implemente o método nos arquivos de implementação de HAL da interface correspondente
(
.h
e.cpp
). Coloque as implementações padrão emhardware/interfaces/configstore/1.0/default
. Por exemplo, emhardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
E emhardware/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 do ConfigStore:
- 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>
- Acesse o item ConfigStore usando a função de modelo adequada em
android.hardware.configstore-utils
. Por exemplo, emsystem/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 itemdisableInitBlank
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 instanciado 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 instanciado. - Adicione a dependência de ConfigStore e a biblioteca
configstore-utils
emAndroid.mk
ouAndroid.bp
. Por exemplo, emsystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \