Clientseitige Nutzung

Sie können bedingt kompilierten Code umgestalten, um Werte dynamisch von der HAL-Schnittstelle zu lesen. Zum Beispiel:

#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
// some code fragment
#endif

Framework-Code kann dann abhängig von seinem Typ eine entsprechende Dienstprogrammfunktion aufrufen, die in <configstore/Utils.h> definiert ist.

ConfigStore-Beispiel

Dieses Beispiel zeigt das Lesen TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS , definiert in ConfigStore HAL als forceHwcForVirtualDisplays() mit dem Rückgabetyp 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);

Die Dienstprogrammfunktion ( getBool im Beispiel oben) kontaktiert den configstore Dienst, um das Handle für den Proxy der Schnittstellenfunktion abzurufen, und ruft dann den Wert ab, indem sie das Handle über HIDL/hwbinder aufruft.

Dienstprogrammfunktionen

<configstore/Utils.h> ( configstore/1.0/include/configstore/Utils.h ) stellt Dienstprogrammfunktionen für jeden primitiven Rückgabetyp bereit, einschließlich Optional[Bool|String|Int32|UInt32|Int64|UInt64] , wie unten aufgeführt:

Typ Funktion (Vorlagenparameter weggelassen)
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 benötigt zwei Vorlagenparameter:

  • I ist der Name der Schnittstellenklasse.
  • Func ist der Mitgliedsfunktionszeiger zum Abrufen des Konfigurationselements.

Da der Konfigurationswert schreibgeschützt ist und sich nicht ändert, speichert die Dienstprogrammfunktion den Konfigurationswert intern zwischen. Nachfolgende Aufrufe werden mithilfe des zwischengespeicherten Werts in derselben Verknüpfungseinheit effizienter bedient.

Verwenden von configstore-utils

Die ConfigStore-HAL ist so konzipiert, dass sie für Nebenversions-Upgrades vorwärtskompatibel ist. Das heißt, wenn die HAL überarbeitet wird und einige Framework-Codes die neu eingeführten Elemente verwenden, kann der ConfigStore-Dienst mit einer älteren Nebenversion in /vendor weiterhin verwendet werden.

Stellen Sie aus Gründen der Vorwärtskompatibilität sicher, dass Ihre Implementierung den folgenden Richtlinien entspricht:

  1. 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);
      }
    
  2. 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
    
  3. 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 configstore-utils -Bibliothek für den Zugriff auf das ConfigStore-Element verwendet werden, wird Nr. 1 durch die Implementierung und Nr. 2 durch Compilerfehler garantiert. Aus diesen Gründen empfehlen wir dringend, nach Möglichkeit configstore-utils zu verwenden.