Koşullu olarak derlenen kodu, değerleri HAL arayüzünden dinamik olarak okuyacak şekilde yeniden düzenleyebilirsiniz. Örneğin:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
Ardından çerçeve kodu, türüne bağlı olarak <configstore/Utils.h>
içinde tanımlanan uygun bir yardımcı işlevi çağırabilir.
ConfigStore örneği
Bu örnekte, ConfigStore HAL'de TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
olarak tanımlanan forceHwcForVirtualDisplays()
dönüş türüyle okuma işlemi gösterilmektedir
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);
Yardımcı işlev (yukarıdaki örnekte getBool
) arayüz işlevinin proxy'si için tanıtıcıyı almak üzere configstore
hizmetiyle iletişime geçer, 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 temel dönüş türü için yardımcı işlevler sağlar:
Tür | İş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 kullanılan üye işlevi 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ılar, aynı bağlantı birimindeki önbelleğe alınmış değer kullanılarak daha verimli bir şekilde işlenir.
configstore-utils kullanma
ConfigStore HAL, küçük sürüm yükseltmeleriyle ileriye dönük uyumlu olacak şekilde tasarlanmıştır. Bu nedenle, HAL düzeltildiğinde ve bazı çerçeve kodu yeni kullanıma sunulan öğeleri kullandığında /vendor
içindeki daha eski bir küçük sürüme sahip ConfigStore hizmeti hâlâ kullanılabilir.
İleriye dönük uyumluluk için uygulamanızın aşağıdaki yönergelere uygun olduğundan emin olun:
- Yeni öğeler, yalnızca eski sürümün hizmeti kullanılabildiğinde 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, yüklü sürüm v1_1 ise
getService()
için v1_1 hizmeti döndürülmelidir:V1_0::IConfig::getService()->v1_0API();
configstore-utils
kitaplığındaki erişim işlevleri ConfigStore öğesine erişmek için kullanıldığında #1, uygulamayla; #2 ise derleyici hatalarıyla garanti edilir. Bu nedenle, mümkün olan her yerde configstore-utils
kullanmanızı önemle tavsiye ederiz.