ConfigStore のクラスとアイテムの追加

既存のインターフェース クラスに新しい ConfigStore アイテム(インターフェース メソッド)を追加できます。インターフェース クラスが定義されていない場合は、そのクラスの ConfigStore アイテムを追加する前に、新しいクラスを追加する必要があります。このセクションでは、IChargerConfigs インターフェース クラスに追加される healthddisableInitBlank 構成アイテムの例を使用します。

インターフェース クラスの追加

追加するインターフェース メソッドにインターフェース クラスが定義されていない場合は、関連する ConfigStore アイテムを追加する前に、インターフェース クラスを追加する必要があります。

  1. 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
    };
    
  2. Android.bpAndroid.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.bpAndroid.mk が更新されます。
  3. サーバーコードを実装するための 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.hChargerConfigs.cpp という 2 つのファイルが作成されます。
  4. .h および .cpp 実装ファイルを開き、関数 HIDL_FETCH_name に関連するコードを削除します(たとえば HIDL_FETCH_IChargerConfigs)。この関数は HIDL パススルー モードに必要ですが、ConfigStore では使用されません。
  5. 実装を 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
    }
    
  6. 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
    
  7. (省略可)マニフェスト エントリを追加します。マニフェスト エントリが存在しない場合のデフォルトは、ConfigStore の「default」インスタンス名です。device/google/marlin/manifest.xml での例を次に示します。
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. 必要な場合(つまり、クライアントが hal_configstore の hwbinder 呼び出しを行う権限を持っていない場合)は、sepolicy ルールを追加します。system/sepolicy/private/healthd.te での例を次に示します。
    ... // other rules
    binder_call(healthd, hal_configstore)
    

新しい ConfigStore アイテムの追加

新しい ConfigStore アイテムを追加するには:

  1. 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);
    };
    
  2. 対応するインターフェースの 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 アイテムを使用するには:

  1. 必要なヘッダー ファイルを含めます。system/core/healthd/healthd.cpp での例を次に示します。
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. 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 サービスに接続することなく、キャッシュされた値からすばやく取得できます。
  3. 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) \