Вы можете добавить новые элементы 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
:using 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) \