Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Agregar 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 ConfigStore para esa clase. Esta sección usa el ejemplo de un disableInitBlank configuración healthd para healthd se agrega a la clase de interfaz IChargerConfigs .

Agregar 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 de ConfigStore asociados.

  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 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 ChargerConfigs.cpp , en hardware/interfaces/configstore/1.0/default .
  4. Abrir los .h y .cpp archivos de aplicación y el código de eliminación relacionados con la función HIDL_FETCH_ name (por ejemplo, HIDL_FETCH_IChargerConfigs ). Esta función es necesaria para el modo de paso a través de 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 (nombre de modulename Configs.cpp ) a LOCAL_SRC_FILES y para asignar indicadores 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. (Opcional) Agregue una entrada de manifiesto. Si no existe, por defecto 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 hal_configstore a hal_configstore ). Por ejemplo, en system/sepolicy/private/healthd.te :
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Agregar nuevos elementos de ConfigStore

Para agregar un nuevo elemento ConfigStore:

  1. Abra el archivo HAL y agregue el método de interfaz requerido para el artículo. (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. Poner en práctica el método en los correspondientes archivos de implementación de interfaz de HAL ( .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 necesarios. 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 utilizando 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 de 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 se pueda recuperar rápidamente del valor almacenado en caché sin contactar al 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) \