用戶端使用

您可以重構條件編譯的程式碼,以便動態讀取 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 的控制代碼,然後透過 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)

當 HAL 實作未指定設定項目的值時,系統會傳回 defValue 這個預設值。每個函式都會採用兩個範本參數:

  • I 是介面類別名稱。
  • Func 是取得設定項目的成員函式指標。

由於設定值為唯讀且不會變更,因此公用程式函式會在內部快取設定值。後續呼叫會使用相同連結單位中的快取值,以更有效率的方式提供服務。

使用 configstore-utils

ConfigStore HAL 的設計目的是為了向前相容,可用於次要版本升級,也就是說,當 HAL 經過修訂,且部分架構程式碼使用新推出的項目時,仍可使用 /vendor 中較舊的次要版本 ConfigStore 服務。

為維持前瞻相容性,請確保實作項目遵循下列規範:

  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,則必須為 getService() 傳回 v1_1 服務:
    V1_0::IConfig::getService()->v1_0API();
    

configstore-utils 程式庫中的存取函式用於存取 ConfigStore 項目時,#1 會由實作保證,#2 則由編譯器錯誤保證。基於這些原因,我們強烈建議您盡可能使用 configstore-utils