Вы можете добавить новые элементы 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, чтобы добавить файл реализации (modulenameConfigs.cpp) вLOCAL_SRC_FILESи сопоставить флаги сборки с определениями макросов. Например, в следующем коде:hardware/interfaces/configstore/1.0/default/Android.mkLOCAL_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.mkLOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \