Вы можете добавлять новые элементы ConfigStore (то есть методы интерфейса) для существующего класса интерфейса. Если класс интерфейса не определен, вы должны добавить новый класс, прежде чем сможете добавить элемент ConfigStore для этого класса. В этом разделе используется пример элемента конфигурации disableInitBlank
для healthd
, добавляемого в класс интерфейса IChargerConfigs
.
Добавить классы интерфейса
Если для метода интерфейса, который вы хотите добавить, не определен класс интерфейса, необходимо добавить класс интерфейса, прежде чем можно будет добавить связанные элементы ConfigStore.
- Создайте файл интерфейса HAL. Версия ConfigStore — 1.0, поэтому определите интерфейсы ConfigStore в
hardware/interfaces/configstore/1.0
. Например, вhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package [email protected]; 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 [email protected]::IChargerConfigs
hidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport [email protected]::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 [email protected]::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
- (Необязательно) Добавьте запись манифеста. Если ее нет, по умолчанию используется имя экземпляра "default" 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 [email protected]; 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 := \ [email protected] \ android.hardware.configstore-utils \ ... (other libraries) \