Użycie po stronie klienta

Możesz refaktoryzować kod skompilowany warunkowo, aby dynamicznie odczytywać wartości interfejsu HAL. Na przykład:

#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
// some code fragment
#endif

Kod platformy może następnie wywołać odpowiednią funkcję użytkową zdefiniowaną w <configstore/Utils.h> w zależności od typu.

Przykład magazynu konfiguracji

Ten przykład pokazuje czytanie TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS, zdefiniowana w HAL ConfigStore jako forceHwcForVirtualDisplays() z zwracanym typem 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);

Funkcja narzędziowa (getBool w powyższym przykładzie) kontaktuje się z obiektem configstore, aby pobrać uchwyt dla serwera proxy funkcji interfejsu, a następnie pobiera wartość przez wywołanie uchwytu HIDL/hwbinder.

Funkcje użytkowe

<configstore/Utils.h> (configstore/1.0/include/configstore/Utils.h) zapewnia narzędzia dla każdego zwracanego typu podstawowego, w tym Optional[Bool|String|Int32|UInt32|Int64|UInt64], zgodnie z informacjami poniżej:

Typ Funkcja (pominięte parametry szablonu)
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 to wartość domyślna zwracana, gdy implementacja HAL nie określa wartości elementu konfiguracji. Każda funkcja przyjmuje dwa parametry szablonu:

  • I to nazwa klasy interfejsu.
  • Func to wskaźnik funkcji składowej dla: pobierania elementu konfiguracji.

Wartość konfiguracji jest tylko do odczytu i nie zmienia się, dlatego narzędzie buforuje wartość konfiguracji w pamięci podręcznej. Kolejne wywołania są obsługiwana jest bardziej wydajnie, korzystając z wartości z pamięci podręcznej w tej samej jednostce z linkami.

Używanie polecenia configstore-utils

Interfejs ConfigStore HAL jest zaprojektowany w taki sposób, aby był zgodny z wersją podrzędną co oznacza, że po zmianie HAL i wprowadzeniu części kodu platformy korzysta z nowo wprowadzonych elementów, usługi ConfigStore ze starszą wersją wersji z /vendor wciąż można użyć.

Aby zapewnić zgodność w przyszłości, upewnij się, że implementacja jest zgodna z następujące wytyczne:

  1. Nowe elementy używają wartości domyślnej, gdy usługa jest używana tylko w starej wersji jest dostępna. Przykład:
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. Klient używa pierwszego interfejsu zawierającego element ConfigStore. Przykład:
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. Usługę nowej wersji można pobrać dla interfejsu starej wersji. W z poniższego przykładu: jeśli zainstalowana wersja to v1_1, usługa v1_1 musi dla getService():
    V1_0::IConfig::getService()->v1_0API();
    

Gdy funkcje dostępu w bibliotece configstore-utils są używany w celu uzyskania dostępu do elementu ConfigStore, numer 1 jest gwarantowany przez implementację Drugą są błędy kompilatora. Z tego powodu zdecydowanie zalecamy używanie w miarę możliwości usługi configstore-utils.