您可以为现有接口类添加新的 ConfigStore 项(即接口方法)。如果未定义接口类,您必须先添加一个新类,然后才能为该类添加 ConfigStore 项。本部分使用 disableInitBlank
配置项示例来演示将 healthd
添加到 IChargerConfigs
接口类的过程。
添加接口类
如果您没有为要添加的接口方法定义接口类,则必须先添加接口类,然后才能添加相关联的 ConfigStore 项。
- 创建 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 };
- 为 ConfigStore 共享库和头文件更新
Android.bp
和Android.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.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
。 - 打开
.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) \