Değerleri HAL arayüzünden dinamik olarak okumak için koşullu olarak derlenmiş kodu yeniden düzenleyebilirsiniz. Örneğin:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
Çerçeve kodu daha sonra türüne bağlı olarak <configstore/Utils.h>
de tanımlanan uygun bir yardımcı program işlevini çağırabilir.
ConfigStore örneği
Bu örnek, ConfigStore HAL'de, OptionalBool
dönüş türüyle forceHwcForVirtualDisplays()
olarak tanımlanan TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
okumayı gösterir:
#include <configstore/Utils.h> using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static bool vsyncPhaseOffsetNs = getBool<ISurfaceFlingerConfigs, ISurfaceFlingerConfigs::forceHwcForVirtualDisplays>(false);
Yardımcı işlev (yukarıdaki örnekte getBool
), arayüz işlevinin proxy'sinin tanıtıcısını almak için configstore
hizmetiyle iletişim kurar, ardından HIDL/hwbinder aracılığıyla tanıtıcıyı çağırarak değeri alır.
Yardımcı işlevler
<configstore/Utils.h>
( configstore/1.0/include/configstore/Utils.h
), aşağıda listelendiği gibi Optional[Bool|String|Int32|UInt32|Int64|UInt64]
dahil olmak üzere her ilkel dönüş türü için yardımcı işlevler sağlar:
Tip | İşlev (şablon parametreleri atlandı) |
---|---|
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
, HAL uygulaması yapılandırma öğesi için bir değer belirtmediğinde döndürülen varsayılan değerdir. Her işlev iki şablon parametresi alır:
-
I
arayüz sınıfının adıdır. -
Func
, yapılandırma öğesini almak için üye işlev işaretçisidir.
Yapılandırma değeri salt okunur olduğundan ve değişmediğinden, yardımcı program işlevi yapılandırma değerini dahili olarak önbelleğe alır. Sonraki çağrılara, aynı bağlantı biriminde önbelleğe alınan değer kullanılarak daha verimli bir şekilde hizmet verilir.
Configstore-utils'i kullanma
ConfigStore HAL, küçük sürüm yükseltmeleri için ileriye doğru uyumlu olacak şekilde tasarlanmıştır; bu, HAL revize edildiğinde ve bazı çerçeve kodları yeni tanıtılan öğeleri kullandığında, /vendor
konumunda daha eski bir küçük sürüme sahip ConfigStore hizmetinin hâlâ kullanılabileceği anlamına gelir.
İleriye dönük uyumluluk için uygulamanızın aşağıdaki yönergelere uyduğundan emin olun:
- Yeni öğeler, yalnızca eski sürümün hizmeti mevcut olduğunda varsayılan değeri kullanır. Örnek:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
- İstemci, ConfigStore öğesini içeren ilk arayüzü kullanır. Örnek:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- Yeni sürümün hizmeti eski sürümün arayüzü için alınabilir. Aşağıdaki örnekte, kurulu sürüm v1_1 ise
getService()
için v1_1 hizmetinin döndürülmesi gerekir:V1_0::IConfig::getService()->v1_0API();
ConfigStore öğesine erişim için configstore-utils
kitaplığındaki erişim işlevleri kullanıldığında, #1 uygulama tarafından garanti edilir ve #2 ise derleyici hataları tarafından garanti edilir. Bu nedenlerden dolayı, mümkün olan her yerde configstore-utils
kullanılmasını şiddetle tavsiye ederiz.