É possível refatorar o código compilado condicionalmente para ler valores dinamicamente de pela interface HAL. Exemplo:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
O código do framework pode chamar uma função utilitária apropriada definida no
<configstore/Utils.h>
, dependendo do tipo.
Exemplo de ConfigStore
Este exemplo mostra como ler
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
, definido na HAL ConfigStore
como forceHwcForVirtualDisplays()
com tipo de retorno
OptionalBool
:
#include <configstore/Utils.h> using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static bool vsyncPhaseOffsetNs = getBool<ISurfaceFlingerConfigs, ISurfaceFlingerConfigs::forceHwcForVirtualDisplays>(false);
A função utilitária (getBool
no exemplo acima) entra em contato com o
serviço configstore
para conseguir o identificador do proxy da
função de interface e recupera o valor invocando o handle por
HIDL/hwbinder.
Funções utilitárias
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h
) oferece utilidade
para cada tipo de retorno primitivo, incluindo
Optional[Bool|String|Int32|UInt32|Int64|UInt64]
, conforme listado
abaixo:
Tipo | Função (parâmetros de modelo omitidos) |
---|---|
OptionalBool |
bool getBool(const bool defValue) |
OptionalInt32 |
int32_t getInt32(const int32_t defValue) |
OptionalUInt32 |
uint32_t getUInt32(const uint32_t defValue) |
OptionalInt64 |
int64_t getInt64(const int64_t defValue) |
OptionalUInt64 |
uint64_t getUInt64(const uint64_t defValue) |
OptionalString |
std::string getString(const std::string &defValue) |
defValue
é um valor padrão retornado quando a implementação da HAL
não especifica um valor para o item de configuração. Cada função leva duas
parâmetros do modelo:
I
é o nome da classe da interface.Func
é o ponteiro da função membro para acessar o item de configuração.
Como o valor de configuração é somente leitura e não muda, o utilitário armazena internamente o valor de configuração. As chamadas seguintes são atendidos com mais eficiência usando o valor armazenado em cache no mesmo bloco de vinculação.
Usar o configstore-utils
A HAL ConfigStore foi projetada para ser compatível com versões futuras
o que significa que, quando a HAL for revisada e algum código do framework
usa os itens recém-introduzidos, o serviço ConfigStore com uma versão secundária mais antiga,
em /vendor
ainda pode ser usada.
Para compatibilidade com versões futuras, verifique se sua implementação está de acordo com seguintes diretrizes:
- Os novos itens usam o valor padrão quando apenas o serviço da versão antiga
está disponível. Exemplo:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
- O cliente usa a primeira interface que incluiu o item ConfigStore.
Exemplo:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- O serviço da nova versão pode ser recuperado para a interface da versão antiga. Em
exemplo a seguir, se a versão instalada for v1_1, o serviço v1_1 deverá
ser retornado para
getService()
:V1_0::IConfig::getService()->v1_0API();
Quando as funções de acesso na biblioteca configstore-utils
são
usada para acessar o item ConfigStore, o no 1 é garantido pela implementação
e o no 2 é garantido por erros do compilador. Por esses motivos, recomendamos fortemente
recomendamos usar configstore-utils
sempre que possível.