Вы можете добавить новые элементы ConfigStore (то есть методы интерфейса) для существующего класса интерфейса. Если класс интерфейса не определён, необходимо добавить новый класс, прежде чем можно будет добавить элемент ConfigStore для этого класса. В этом разделе используется пример добавления элемента конфигурации disableInitBlank
для healthd
в класс интерфейса IChargerConfigs
.
Добавить классы интерфейсов
Если для метода интерфейса, который вы хотите добавить, не определен класс интерфейса, необходимо добавить класс интерфейса, прежде чем можно будет добавить связанные элементы 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
Android.bp
иAndroid.mk
вhardware/interfaces/configstore/1.0
. - Сгенерируйте заглушку 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
ChargerConfigs.h
иChargerConfigs.cpp
, вhardware/interfaces/configstore/1.0/default
. - Откройте файлы реализации
.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
, добавив файл реализации (modulename Configs.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 по умолчанию. Например, в
device/google/marlin/manifest.xml
:<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- При необходимости добавьте правило sepolicy (то есть, если у клиента нет прав на вызовы hwbinder к
hal_configstore
). Например, вsystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Добавить новые элементы ConfigStore
Чтобы добавить новый элемент ConfigStore:
- Откройте файл HAL и добавьте требуемый метод интерфейса для элемента. (Файлы
.hal
для ConfigStore находятся в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>
- Доступ к элементу ConfigStore осуществляется с помощью соответствующей шаблонной функции в
android.hardware.configstore-utils
. Например, вsystem/core/healthd/healthd.cpp
: В этом примере элемент ConfigStoreusing namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
disableInitBlank
извлекается и сохраняется в переменной (полезно, когда к переменной требуется обращаться несколько раз). Значение, извлечённое из ConfigStore, кэшируется внутри инстанцированной функции шаблона, что позволяет быстро извлечь его из кэшированного значения без обращения к службе ConfigStore для последующих вызовов инстанцированной функции шаблона. - Добавьте зависимость от ConfigStore и библиотеки
configstore-utils
вAndroid.mk
илиAndroid.bp
. Например, вsystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \