Google is committed to advancing racial equity for Black communities. See how.
Эта страница переведена с помощью Cloud Translation API.
Switch to English

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

Вы можете добавить новые элементы ConfigStore (то есть методы интерфейса) для существующего класса интерфейса. Если класс интерфейса не определен, вы должны добавить новый класс, прежде чем вы сможете добавить элемент ConfigStore для этого класса. В этом разделе используется пример disableInitBlank конфигурации healthd для healthd , добавляемого в IChargerConfigs интерфейса 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_ 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 marlin device/google/marlin/manifest.xml :
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. При необходимости добавьте правило sepolicy (то есть, если у клиента нет разрешений на выполнение вызовов hal_configstore в 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);
    
    В этом примере элемент 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) \