您可以重構有條件編譯的程式碼,以動態方式讀取值 HAL 介面例如:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
這樣一來,架構程式碼就能呼叫
<configstore/Utils.h>
(視類型而定)。
ConfigStore 範例
這個範例顯示:
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
服務,以取得 Proxy 的 Proxy 控制代碼
介面函式,然後透過叫用控制代碼來擷取值
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 經過修改時和一些架構程式碼
使用新導入的項目,ConfigStore 服務具有較舊的子項目
您仍可使用 /vendor
的版本。
為維持前瞻相容性,請確保實作方式遵循 下列規範:
- 「只有」舊版服務會使用新項目的預設值
可以使用。範例:
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,則 v1_1 服務必須
退回
getService()
:V1_0::IConfig::getService()->v1_0API();
configstore-utils
程式庫中的存取函式出現以下情況時
而 #1 則由實作保證
第 2 項是編譯器錯誤保證。因此,我們強烈建議
建議您盡可能使用 configstore-utils
。