Вы можете добавлять новые элементы 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::IChargerConfigshidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigsAndroid.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) \