Agrega clases y elementos de ConfigStore

Puedes agregar elementos nuevos de ConfigStore (es decir, métodos de interfaz) para una clase de interfaz existente. Si no se define la clase de interfaz, debes agregar una clase nueva antes de poder agregar un elemento de ConfigStore para esa clase. En esta sección, se usa el ejemplo de un elemento de configuración disableInitBlank para healthd que se agrega a la clase de interfaz IChargerConfigs.

Agrega clases de interfaz

Si no se define ninguna clase de interfaz para el método de interfaz que deseas agregar, debes agregar la clase de interfaz antes de poder agregar los elementos de ConfigStore asociados.

  1. Crea un archivo de interfaz de HAL. La versión de ConfigStore es 1.0, por lo que debes definir 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. Actualiza Android.bp y Android.mk para la biblioteca compartida y los archivos de encabezado de ConfigStore para incluir la nueva HAL de la interfaz. 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. Genera el stub 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. Abre los archivos de implementación .h y .cpp, y quita 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 de HIDL, que no usa ConfigStore.
  5. Registra la implementación en el servicio de 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. Modifica el archivo Android.mk para agregar el archivo de implementación (modulenameConfigs.cpp) a LOCAL_SRC_FILES y para asignar marcas de compilación a definiciones de macros. 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. Agrega una entrada de manifiesto (opcional). Si no existe, se usa 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. Agrega la regla de 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)
    

Cómo agregar elementos nuevos a ConfigStore

Para agregar un nuevo elemento de ConfigStore, haz lo siguiente:

  1. Abre el archivo HAL y agrega el método de interfaz requerido para el elemento. (Los archivos .hal de 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. Implementa el método en los archivos de implementación del HAL de la interfaz correspondientes (.h y .cpp). Coloca 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();
    }
    

Usa elementos de ConfigStore

Para usar un elemento de ConfigStore, haz lo siguiente:

  1. Incluye 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. Accede al elemento ConfigStore con 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, se recupera el elemento disableInitBlank de ConfigStore y se almacena en una variable (útil cuando se necesita 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 se pueda recuperar rápidamente del valor almacenado en caché sin comunicarse con el servicio de ConfigStore para llamadas posteriores a la función de plantilla instanciada.
  3. Agrega 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) \