既存のインターフェース クラスに新しい ConfigStore アイテム(インターフェース メソッド)を追加できます。インターフェース クラスが定義されていない場合は、そのクラスの ConfigStore アイテムを追加する前に、新しいクラスを追加する必要があります。このセクションでは、IChargerConfigs
インターフェース クラスに追加される healthd
の disableInitBlank
構成アイテムの例を使用します。
インターフェース クラスを追加する
追加するインターフェース メソッドにインターフェース クラスが定義されていない場合は、関連する ConfigStore アイテムを追加する前に、インターフェース クラスを追加する必要があります。
- HAL インターフェース ファイルを作成します。ConfigStore のバージョンは 1.0 であるため、ConfigStore インターフェースを
hardware/interfaces/configstore/1.0
で定義します。hardware/interfaces/configstore/1.0/IChargerConfigs.hal
での例を次に示します。package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
Android.bp
とAndroid.mk
を更新して、ConfigStore の共有ライブラリとヘッダー ファイルに新しいインターフェース HAL を含めます。例:hidl-gen -o hardware/interfaces/configstore/1.0/default -Lmakefile -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
hidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
hardware/interfaces/configstore/1.0
内のAndroid.bp
とAndroid.mk
が更新されます。- サーバーコードを実装するための C++ スタブを生成します。例:
hidl-gen -o hardware/interfaces/configstore/1.0/default -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
このコマンドにより、hardware/interfaces/configstore/1.0/default
内にChargerConfigs.h
とChargerConfigs.cpp
という 2 つのファイルが作成されます。 .h
および.cpp
実装ファイルを開き、関数HIDL_FETCH_name
に関連するコードを削除します(たとえばHIDL_FETCH_IChargerConfigs
)。この関数は HIDL パススルー モードに必要ですが、ConfigStore では使用されません。- 実装を ConfigStore サービスに登録します。
hardware/interfaces/configstore/1.0/default/service.cpp
での例を次に示します。#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include "ChargerConfigs.h" using android::hardware::configstore::V1_0::IChargerConfigs; using android::hardware::configstore::V1_0::implementation::ChargerConfigs; int main() { ... // other code sp<IChargerConfigs> chargerConfigs = new ChargerConfigs; status = chargerConfigs->registerAsService(); LOG_ALWAYS_FATAL_IF(status != OK, "Could not register IChargerConfigs"); ... // other code }
Android.mk
ファイルを変更して、実装ファイル(modulenameConfigs.cpp
)をLOCAL_SRC_FILES
に追加し、ビルドフラグをマクロ定義にマッピングします。hardware/interfaces/configstore/1.0/default/Android.mk
での例を次に示します。LOCAL_SRC_FILES += ChargerConfigs.cpp ifeq ($(strip $(BOARD_CHARGER_DISABLE_INIT_BLANK)),true) LOCAL_CFLAGS += -DCHARGER_DISABLE_INIT_BLANK endif
- (省略可)マニフェスト エントリを追加します。マニフェスト エントリが存在しない場合のデフォルトは、ConfigStore の「default」インスタンス名です。
device/google/marlin/manifest.xml
での例を次に示します。<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- 必要な場合(つまり、クライアントが
hal_configstore
の hwbinder 呼び出しを行う権限を持っていない場合)は、sepolicy ルールを追加します。system/sepolicy/private/healthd.te
での例を次に示します。... // other rules binder_call(healthd, hal_configstore)
新しい ConfigStore アイテムを追加する
新しい ConfigStore アイテムを追加するには:
- HAL ファイルを開き、アイテムに必要なインターフェース メソッドを追加します(ConfigStore の
.hal
ファイルはhardware/interfaces/configstore/1.0
にあります)。hardware/interfaces/configstore/1.0/IChargerConfigs.hal
での例を次に示します。package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- 対応するインターフェースの HAL 実装ファイル(
.h
と.cpp
)にメソッドを実装します。デフォルト実装をhardware/interfaces/configstore/1.0/default
に配置します。hardware/interfaces/configstore/1.0/default/ChargerConfigs.h
での例を次に示します。struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
hardware/interfaces/configstore/1.0/default/ChargerConfigs.cpp
での例を次に示します。Return<void> ChargerConfigs::disableInitBlank(disableInitBlank_cb _hidl_cb) { bool value = false; #ifdef CHARGER_DISABLE_INIT_BLANK value = true; #endif _hidl_cb({true, value}); return Void(); }
ConfigStore アイテムを使用する
ConfigStore アイテムを使用するには:
- 必要なヘッダー ファイルを含めます。
system/core/healthd/healthd.cpp
での例を次に示します。#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
android.hardware.configstore-utils
内の適切なテンプレート関数を使用して、ConfigStore アイテムにアクセスします。system/core/healthd/healthd.cpp
での例を次に示します。using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
この例では、ConfigStore アイテムのdisableInitBlank
が取得され、変数に格納されます(変数に複数回アクセスする必要がある場合に便利です)。ConfigStore から取得した値は、インスタンス化されたテンプレート関数内にキャッシュされるため、インスタンス化されたテンプレート関数を後で呼び出す際に、ConfigStore サービスに接続することなく、キャッシュされた値からすばやく取得できます。Android.mk
またはAndroid.bp
に、ConfigStore とconfigstore-utils
ライブラリへの依存関係を追加します。system/core/healthd/Android.mk
での例を次に示します。LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \