条件付きでコンパイルされたコードをリファクタリングして、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 サービスを使用できます。
上位互換性を確保するには、実装が次のガイドラインに準拠している必要があります。
- 古いバージョンのサービスのみが利用可能な場合、新しいアイテムはデフォルト値を使用します。以下に例を示します。
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
を使用することを強くおすすめします。