Vous pouvez refactoriser le code compilé de manière conditionnelle pour lire les valeurs de manière dynamique à partir de l'interface HAL. Exemple :
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
Le code du framework peut ensuite appeler une fonction utilitaire appropriée définie dans
<configstore/Utils.h>
selon son type.
Exemple ConfigStore
Cet exemple montre comment lire
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
, défini dans ConfigStore HAL
en tant que forceHwcForVirtualDisplays()
avec le type renvoyé
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 fonction utilitaire (getBool
dans l'exemple ci-dessus) contacte la
configstore
pour obtenir le handle du proxy
d'interface utilisateur, puis récupère la valeur en appelant le handle via
HIDL/hwbinder.
Fonctions utilitaires
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h
) fournit
pour chaque type primitif renvoyé, y compris
Optional[Bool|String|Int32|UInt32|Int64|UInt64]
, tel qu'indiqué
ci-dessous:
Type | Fonction (paramètres de modèle omis) |
---|---|
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
est une valeur par défaut renvoyée lorsque l'implémentation HAL
ne spécifie pas de valeur pour l'élément de configuration. Chaque fonction nécessite
Paramètres du modèle:
I
est le nom de la classe de l'interface.Func
est le pointeur de la fonction membre pour obtenir l'élément de configuration.
Comme la valeur de la configuration est en lecture seule et ne change pas, l'utilitaire met en cache en interne la valeur de configuration. Les appels ultérieurs sont est traitée plus efficacement à l'aide de la valeur mise en cache dans la même unité d'association.
Utiliser configstore-utils
Le HAL de ConfigStore est conçu pour être compatible avec les versions mineures
des mises à niveau, c'est-à-dire que lorsque le HAL est révisé et que le code du framework
utilise les nouveaux éléments, le service ConfigStore, avec une version mineure
la version en /vendor
peut toujours être utilisée.
Pour assurer la compatibilité ascendante, assurez-vous que votre implémentation respecte le consignes suivantes:
- La valeur par défaut est utilisée uniquement lorsque le service de l'ancienne version est utilisé.
est disponible. Exemple:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
- Le client utilise la première interface qui incluait l'élément ConfigStore.
Exemple:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- Le service de la nouvelle version peut être récupéré pour l'interface de l'ancienne version. Dans
l'exemple suivant, si la version installée est v1_1, le service v1_1 doit
être renvoyé pour
getService()
:V1_0::IConfig::getService()->v1_0API();
Lorsque les fonctions d'accès de la bibliothèque configstore-utils
sont
utilisé pour accéder à l'élément ConfigStore, la première est garantie par l'implémentation
et le n° 2 est garanti
par les erreurs de compilation. C'est pourquoi nous vous recommandons
recommandez d'utiliser configstore-utils
dans la mesure du possible.