Sie können bedingt kompilierten Code umgestalten, um Werte dynamisch aus der HAL-Schnittstelle zu lesen. Beispiel:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
Framework-Code kann dann je nach Typ eine entsprechende Hilfsfunktion aufrufen, die in
<configstore/Utils.h> definiert ist.
ConfigStore-Beispiel
In diesem Beispiel wird TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS gelesen, das in der ConfigStore HAL als forceHwcForVirtualDisplays() mit dem Rückgabetyp OptionalBool definiert ist:
#include <configstore/Utils.h>
using namespace android::hardware::configstore;
using namespace android::hardware::configstore::V1_0;
static bool vsyncPhaseOffsetNs = getBool<ISurfaceFlingerConfigs,
ISurfaceFlingerConfigs::forceHwcForVirtualDisplays>(false);
Die Dienstfunktion (getBool im obigen Beispiel) kontaktiert den configstore-Dienst, um das Handle für den Proxy der Schnittstellenfunktion abzurufen, und ruft dann den Wert auf, indem sie das Handle über HIDL/hwbinder aufruft.
Hilfsfunktionen
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h) bietet Hilfsfunktionen für jeden primitiven Rückgabetyp, einschließlich
Optional[Bool|String|Int32|UInt32|Int64|UInt64], wie unten aufgeführt:
| Typ | Funktion (Vorlagenparameter ausgelassen) |
|---|---|
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 ist ein Standardwert, der zurückgegeben wird, wenn die HAL-Implementierung keinen Wert für das Konfigurationselement angibt. Jede Funktion verwendet zwei Vorlagenparameter:
Iist der Name der Schnittstellenklasse.Funcist der Zeiger auf die Memberfunktion zum Abrufen des Konfigurationselements.
Da der Konfigurationswert schreibgeschützt ist und sich nicht ändert, speichert die Hilfsfunktion den Konfigurationswert intern im Cache. Nachfolgende Aufrufe werden mit dem im Cache gespeicherten Wert in derselben Verknüpfungseinheit effizienter verarbeitet.
configstore-utils verwenden
Die ConfigStore HAL ist so konzipiert, dass sie für kleinere Versionsupgrades abwärtskompatibel ist. Das bedeutet, dass der ConfigStore-Dienst mit einer älteren Nebenversion in /vendor weiterhin verwendet werden kann, wenn die HAL überarbeitet wird und einige Framework-Codes die neu eingeführten Elemente verwenden.
Achten Sie für die Abwärtskompatibilität darauf, dass Ihre Implementierung die folgenden Richtlinien erfüllt:
- Neue Elemente verwenden den Standardwert, wenn nur der Dienst der alten Version verfügbar ist. Beispiel:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); } - Der Client verwendet die erste Schnittstelle, die das ConfigStore-Element enthält.
Beispiel:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- Der Dienst der neuen Version kann für die Schnittstelle der alten Version abgerufen werden. Wenn im folgenden Beispiel die installierte Version v1_1 ist, muss der Dienst v1_1 für
getService()zurückgegeben werden:V1_0::IConfig::getService()->v1_0API();
Wenn die Zugriffsfunktionen in der Bibliothek configstore-utils für den Zugriff auf das ConfigStore-Element verwendet werden, wird #1 durch die Implementierung und #2 durch Compilerfehler garantiert. Aus diesen Gründen empfehlen wir dringend, configstore-utils nach Möglichkeit zu verwenden.