Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Uso del lado del cliente

Puede refactorizar código compilado condicionalmente para leer valores de forma dinámica desde la interfaz HAL. Por ejemplo:

#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
//some code fragment
#endif

El código del marco puede entonces llamar a una función de utilidad apropiada definida en <configstore/Utils.h> dependiendo de su tipo.

Ejemplo de ConfigStore

Este ejemplo muestra la lectura de TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS , definido en ConfigStore HAL como forceHwcForVirtualDisplays() con 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);

La función de utilidad ( getBool en el ejemplo anterior) se pone en contacto con el servicio configstore para obtener el identificador del proxy de la función de interfaz, luego recupera el valor invocando el identificador a través de HIDL / hwbinder.

Funciones de utilidad

<configstore/Utils.h> ( configstore/1.0/include/configstore/Utils.h ) proporciona funciones de utilidad para cada tipo de retorno primitivo, incluido Optional[Bool|String|Int32|UInt32|Int64|UInt64] , 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 devuelve cuando la implementación de 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 la clase de interfaz.
  • Func es el puntero de función miembro para obtener el elemento de configuración.

Debido a que el valor de configuración es de solo lectura y no cambia, la función de utilidad almacena en caché internamente el valor de configuración. Las llamadas posteriores se atienden de manera más eficiente utilizando el valor almacenado en caché en la misma unidad de enlace.

Usando configstore-utils

ConfigStore HAL está diseñado para ser compatible con versiones posteriores para actualizaciones de versiones menores, lo que significa que cuando se revisa HAL y algún código de marco usa los elementos recién introducidos, el servicio ConfigStore con una versión menor anterior en /vendor aún se puede usar.

Para compatibilidad con versiones posteriores, asegúrese de que su implementación se adhiera a las siguientes pautas:

  1. Los elementos nuevos utilizan el valor predeterminado cuando solo está disponible el servicio de la versión anterior. Ejemplo:
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. El cliente usa la primera interfaz que incluía el elemento ConfigStore. Ejemplo:
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. El servicio de la nueva versión se puede recuperar para la interfaz de la versión anterior. En el siguiente ejemplo, si la versión instalada es v1_1, el servicio v1_1 debe devolverse para getService() :
    V1_0::IConfig::getService()->v1_0API();
    

Cuando las funciones de acceso en la biblioteca configstore-utils se utilizan para acceder al elemento ConfigStore, el # 1 está garantizado por la implementación y el # 2 está garantizado por los errores del compilador. Por estas razones, recomendamos encarecidamente utilizar configstore-utils siempre que sea posible.