添加 ConfigStore 类和项

您可以为现有接口类添加新的 ConfigStore 项(即接口方法)。如果您未定义接口类,则必须先添加一个新类,然后才能为该接口类添加 ConfigStore 项。本部分使用 disableInitBlank 配置项示例来演示将 healthd 添加到 IChargerConfigs 接口类的过程。

注意:请务必先熟悉常规 HIDL 概念HIDL C++ 开发工作流程HIDL 代码样式ConfigStore 设计,然后再继续操作。

添加接口类

如果您没有为要添加的接口方法定义接口类,则必须先添加接口类,然后才能添加相关联的 ConfigStore 项。

  1. 创建 HAL 接口文件。ConfigStore 版本为 1.0,因此请在 hardware/interfaces/configstore/1.0 中定义 ConfigStore 接口。例如,在 hardware/interfaces/configstore/1.0/IChargerConfigs.hal 中运行以下命令:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. 为 ConfigStore 共享库和标头文件更新 Android.bpAndroid.mk,以包含新的接口 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
  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 中。

    注意:使用 -Lc++-impl 运行 hidl-gen 将为新添加的接口方法生成框架代码。不过,由于该方法也会覆盖所有现有接口方法的实现,因此请酌情使用 -o 选项。

    例如,在 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.mkAndroid.bp 中添加对 ConfigStore 和 configstore-utils 库的依赖关系。例如,在 system/core/healthd/Android.mk 中运行以下命令:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \