Adición de clases y elementos de ConfigStore

Puede agregar nuevos elementos de ConfigStore (es decir, métodos de interfaz) para una clase de interfaz existente. Si la clase de interfaz no está definida, debe agregar una nueva clase antes de poder agregar un elemento de ConfigStore para esa clase. Esta sección utiliza el ejemplo de un elemento de configuración healthd disableInitBlank se agrega a la clase de interfaz IChargerConfigs .

Adición de clases de interfaz

Si no se define una clase de interfaz para el método de interfaz que desea agregar, debe agregar la clase de interfaz antes de poder agregar los elementos asociados de ConfigStore.

  1. Cree un archivo de interfaz HAL. La versión de ConfigStore es 1.0, así que defina las interfaces de ConfigStore en hardware/interfaces/configstore/1.0 . Por ejemplo, en hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Actualice Android.bp y Android.mk para la biblioteca compartida de ConfigStore y los archivos de encabezado para incluir la nueva interfaz HAL. Por ejemplo:
    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
    
    Estos comandos actualizan Android.bp y Android.mk en hardware/interfaces/configstore/1.0 .
  3. Genere el código auxiliar de C++ para implementar el código del servidor. Por ejemplo:
    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
    
    Este comando crea dos archivos, ChargerConfigs.h y ChargerConfigs.cpp , en hardware/interfaces/configstore/1.0/default .
  4. Abra los archivos de implementación .h y .cpp y elimine el código relacionado con la función HIDL_FETCH_ name (por ejemplo, HIDL_FETCH_IChargerConfigs ). Esta función es necesaria para el modo de transferencia HIDL, que ConfigStore no utiliza.
  5. Registre la implementación en el servicio ConfigStore. Por ejemplo, en 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. Modifique el archivo Android.mk para agregar el archivo de implementación ( modulename Configs.cpp ) a LOCAL_SRC_FILES y para asignar indicadores de compilación en definiciones de macro. Por ejemplo, en 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. (Opcional) Agregue una entrada de manifiesto. Si no existe, utilice de forma predeterminada el nombre de instancia "predeterminado" de ConfigStore. Por ejemplo, en device/google/marlin/manifest.xml :
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. Agregue la regla sepolicy si es necesario (es decir, si el cliente no tiene permisos para realizar llamadas de hwbinder a hal_configstore ). Por ejemplo, en system/sepolicy/private/healthd.te :
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Adición de nuevos elementos de ConfigStore

Para agregar un nuevo elemento de ConfigStore:

  1. Abra el archivo HAL y agregue el método de interfaz necesario para el elemento. (Los archivos .hal para ConfigStore residen en hardware/interfaces/configstore/1.0 ). Por ejemplo, en hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Implemente el método en los archivos de implementación HAL de la interfaz correspondiente ( .h y .cpp ). Coloque las implementaciones predeterminadas en hardware/interfaces/configstore/1.0/default . Por ejemplo, en hardware/interfaces/configstore/1.0/default/ChargerConfigs.h :
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    Y en 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();
    }
    

Uso de elementos de ConfigStore

Para utilizar un elemento de ConfigStore:

  1. Incluya los archivos de encabezado requeridos. Por ejemplo, en system/core/healthd/healthd.cpp :
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Acceda al elemento ConfigStore mediante la función de plantilla adecuada en android.hardware.configstore-utils . Por ejemplo, en 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);
    
    En este ejemplo, el elemento disableInitBlank se recupera y almacena en una variable (útil cuando es necesario acceder a la variable varias veces). El valor recuperado de ConfigStore se almacena en caché dentro de la función de plantilla instanciada para que pueda recuperarse rápidamente del valor almacenado en caché sin ponerse en contacto con el servicio ConfigStore para llamadas posteriores a la función de plantilla instanciada.
  3. Agregue la dependencia en ConfigStore y la biblioteca configstore-utils en Android.mk o Android.bp . Por ejemplo, en system/core/healthd/Android.mk :
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \