Добавьте классы и элементы ConfigStore.

Вы можете добавлять новые элементы ConfigStore (то есть методы интерфейса) для существующего класса интерфейса. Если класс интерфейса не определен, необходимо добавить новый класс, прежде чем добавлять элемент ConfigStore для этого класса. В этом разделе используется пример добавления элемента конфигурации disableInitBlank для healthd в класс интерфейса IChargerConfigs .

Добавить классы интерфейса

Если для метода интерфейса, который вы хотите добавить, не определен класс интерфейса, необходимо добавить класс интерфейса, прежде чем добавлять соответствующие элементы ConfigStore.

  1. Создайте файл интерфейса 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
    };
    
  2. Обновите файлы 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 .
  3. Сгенерируйте заглушку на 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 .
  4. Откройте файлы реализации .h и .cpp и удалите код, связанный с HIDL_FETCH_ name (например, HIDL_FETCH_IChargerConfigs ). Эта функция необходима для режима сквозной передачи HIDL, который не используется ConfigStore.
  5. Зарегистрируйте реализацию в службе 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
    }
    
  6. Измените файл 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
    
  7. (Необязательно) Добавьте запись в манифест. Если она отсутствует, используйте по умолчанию имя экземпляра ConfigStore по умолчанию. Например, в device/google/marlin/manifest.xml :
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. Добавьте правило sepolicy при необходимости (то есть, если у клиента нет разрешений на выполнение вызовов hwbinder к hal_configstore ). Например, в system/sepolicy/private/healthd.te :
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Добавить новые элементы ConfigStore

Чтобы добавить новый элемент в ConfigStore:

  1. Откройте 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);
    };
    
  2. Реализуйте метод в соответствующих файлах реализации интерфейса 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:

  1. Включите необходимые заголовочные файлы. Например, в system/core/healthd/healthd.cpp :
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Для доступа к элементу 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);
    
    В этом примере элемент ConfigStore disableInitBlank извлекается и сохраняется в переменной (это полезно, когда к переменной необходимо обращаться несколько раз). Полученное из ConfigStore значение кэшируется внутри созданной шаблонной функции, чтобы его можно было быстро получить из кэша без обращения к службе ConfigStore для последующих вызовов созданной шаблонной функции.
  3. Добавьте зависимость от 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) \