您可以重構有條件編譯的代碼以從 HAL 接口動態讀取值。例如:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS //some code fragment #endif
然後,框架代碼可以根據其類型調用<configstore/Utils.h>
中定義的適當實用程序函數。
配置存儲示例
此示例顯示讀取TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
,在 ConfigStore HAL 中定義為forceHwcForVirtualDisplays()
,返回類型為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);
實用程序函數(上例中的getBool
)聯繫configstore
服務以獲取接口函數代理的句柄,然後通過 HIDL/hwbinder 調用句柄來檢索值。
實用功能
<configstore/Utils.h>
( configstore/1.0/include/configstore/Utils.h
) 為每個原始返回類型提供實用函數,包括Optional[Bool|String|Int32|UInt32|Int64|UInt64]
,如下所列:
類型 | 函數(模板參數省略) |
---|---|
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 實現未為配置項指定值時返回的默認值。每個函數接受兩個模板參數:
-
I
是接口類名。 -
Func
是獲取配置項的成員函數指針。
由於配置值是只讀的並且不會更改,因此實用程序函數會在內部緩存配置值。使用同一鏈接單元中的緩存值更有效地為後續調用提供服務。
使用 configstore-utils
ConfigStore HAL 被設計為對次要版本升級進行前向兼容,這意味著當 HAL 被修改並且某些框架代碼使用了新引入的項時,仍然可以使用/vendor
中具有較舊次要版本的 ConfigStore 服務。
為了向前兼容,請確保您的實現遵循以下準則:
- 當只有舊版本的服務可用時,新項目使用默認值。示例:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
- 客戶端使用包含 ConfigStore 項的第一個接口。示例:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- 新版本的服務可以檢索到舊版本的接口。在以下示例中,如果安裝的版本是 v1_1,則
getService()
必須返回 v1_1 服務:V1_0::IConfig::getService()->v1_0API();
當configstore-utils
庫中的訪問函數用於訪問 ConfigStore 項時,#1 由實現保證,#2 由編譯器錯誤保證。由於這些原因,我們強烈建議盡可能使用configstore-utils
。