Puedes refactorizar el código compilado condicionalmente para leer valores de forma dinámica desde la interfaz de la HAL. Por ejemplo:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
El código del framework puede, entonces, llamar a una función de utilidad apropiada definida en
<configstore/Utils.h>
según su tipo.
Ejemplo de ConfigStore
En este ejemplo, se muestra la lectura
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
, definido en la HAL de ConfigStore
como forceHwcForVirtualDisplays()
con tipo de datos que se muestra
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);
La función de utilidad (getBool
en el ejemplo anterior) contacta al
servicio configstore
para obtener el controlador del proxy del
de interfaz de usuario y, luego, recupera el valor invocando el controlador con
HIDL/hwbinder
Funciones de utilidad
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h
) proporciona
para cada tipo primitivo que se devuelve, lo que incluye
Optional[Bool|String|Int32|UInt32|Int64|UInt64]
, tal como se indica
a continuación:
Tipo | Función (se omiten los parámetros de la plantilla) |
---|---|
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
es un valor predeterminado que se muestra cuando se implementa la HAL.
no especifica un valor para el elemento de configuración. Cada función toma dos
Parámetros de plantilla:
I
es el nombre de clase de la interfaz.Func
es el puntero de la función de miembro para obtener el elemento de configuración.
Como el valor de configuración es de solo lectura y no cambia, la utilidad almacena en caché internamente el valor de configuración. Las llamadas posteriores se se entregue de manera más eficiente mediante el valor almacenado en caché en la misma unidad de vinculación.
Usa configstore-utils
La HAL de ConfigStore está diseñada para ser compatible con versiones futuras de la versión secundaria.
de forma predeterminada, es decir, cuando se revisa la HAL y se crea
usa los elementos introducidos recientemente, el servicio ConfigStore con un elemento secundario
aún se puede usar la versión de /vendor
.
Para ofrecer compatibilidad con versiones futuras, asegúrate de que tu implementación cumpla con las los siguientes lineamientos:
- Los elementos nuevos usan el valor predeterminado cuando solo se usa el servicio de la versión anterior
está disponible. Ejemplo:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
- El cliente usa la primera interfaz que incluyó el elemento ConfigStore.
Ejemplo:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- El servicio de la versión nueva se puede recuperar para la interfaz de la versión anterior. En
en el siguiente ejemplo, si la versión instalada es v1_1, el servicio v1_1 debe
se devolverá para
getService()
:V1_0::IConfig::getService()->v1_0API();
Cuando las funciones de acceso de la biblioteca configstore-utils
se
utilizado para acceder al elemento ConfigStore; el núm. 1 está garantizado por la implementación
y el n.o 2 está garantizado por errores del compilador. Por estas razones,
recomienda usar configstore-utils
siempre que sea posible.