既存のインターフェース クラスに新しい 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::IChargerConfigshidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigshardware/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での例を次に示します。 この例では、ConfigStore アイテムのusing namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);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) \