クライアント側の使用方法

条件付きでコンパイルされたコードをリファクタリングして、HAL インターフェースから値を動的に読み取ることができます。次に例を示します。

    #ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
    //some code fragment
    #endif
    

その後、フレームワークのコードは、タイプに応じて <configstore/Utils.h> で定義された適切なユーティリティ関数を呼び出すことができます。

ConfigStore の例

この例では、ConfigStore HAL で戻り値の型が OptionalBool である forceHwcForVirtualDisplays() と定義された、TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS の読み取りを示しています。

    #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 実装で構成アイテムの値が指定されていない場合に返されるデフォルト値です。各関数には次の 2 つのテンプレート パラメータがあります。

  • 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 を使用することを強くおすすめします。