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:
- 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); }
- 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
- 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
.