Sie können bedingt kompilierten Code so umgestalten, dass Werte dynamisch aus der HAL-Schnittstelle gelesen werden. Beispiel:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
Der Framework-Code kann dann je nach Typ eine entsprechende in <configstore/Utils.h>
definierte Hilfsfunktion aufrufen.
ConfigStore-Beispiel
In diesem Beispiel wird TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
gelesen, das im 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 Hilfsfunktion (getBool
im Beispiel oben) kontaktiert den configstore
-Dienst, um den Handle für den Proxy der Schnittstellenfunktion abzurufen. Anschließend wird der Wert abgerufen, indem der Handle über HIDL/hwbinder aufgerufen wird.
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:
Eingeben | 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 in der HAL-Implementierung kein Wert für das Konfigurationselement angegeben ist. Jede Funktion verwendet zwei Vorlagenparameter:
I
ist der Name der Schnittstellenklasse.Func
ist der Zeiger auf die Memberfunktion zum Abrufen des Konfigurationselements.
Da der Konfigurationswert schreibgeschützt ist und sich nicht ändert, wird er intern von der Hilfsfunktion im Cache gespeichert. Nachfolgende Aufrufe werden effizienter mit dem zwischengespeicherten Wert in derselben Linking-Einheit verarbeitet.
configstore-utils verwenden
Der ConfigStore HAL ist für Upgrades von Nebenversionen abwärtskompatibel. Das bedeutet, dass der ConfigStore-Dienst mit einer älteren Nebenversion in /vendor
weiterhin verwendet werden kann, wenn der HAL überarbeitet wird und in einigen Framework-Code die neu eingeführten Elemente verwendet werden.
Achten Sie für die Vorwärtskompatibilität darauf, dass Ihre Implementierung den folgenden Richtlinien entspricht:
- Bei neuen Artikeln wird der Standardwert verwendet, 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. Im folgenden Beispiel muss der v1_1-Dienst für
getService()
zurückgegeben werden, wenn die installierte Version v1_1 ist:V1_0::IConfig::getService()->v1_0API();
Wenn die Zugriffsfunktionen in der configstore-utils
-Bibliothek 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.