客戶端使用

您可以重構條件編譯代碼以從 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進行修訂和一些框架代碼,使用新引進的項目中,ConfigStore服務與舊的次版本/vendor仍然可以使用。

為了向前兼容,請確保您的實現遵循以下準則:

  1. 新項目使用默認值時,只有老版本的服務。例如:
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. 客戶端使用包含 ConfigStore 項的第一個接口。例如:
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. 可以為舊版本的接口檢索新版本的服務。在下面的例子中,如果安裝的版本是V1_1,該V1_1服務必須對返回getService()
    V1_0::IConfig::getService()->v1_0API();
    

當在接入功能configstore-utils庫被用於訪問ConfigStore項,#1由實現保證和#2是由編譯器錯誤保證。由於這些原因,我們強烈建議您使用configstore-utils盡可能。