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 disableInitBlank
para healthd
que se agrega a la clase de interfaz IChargerConfigs
.
Agregar clases de interfaz
Si no se define ninguna 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.
- 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, enhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- Actualice
Android.bp
yAndroid.mk
para la biblioteca compartida y los archivos de encabezado de ConfigStore 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
Android.bp
yAndroid.mk
enhardware/interfaces/configstore/1.0
. - 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
yChargerConfigs.cpp
, enhardware/interfaces/configstore/1.0/default
. - Abra los archivos de implementación
.h
y.cpp
y elimine el código relacionado con la funciónHIDL_FETCH_ name
(por ejemplo,HIDL_FETCH_IChargerConfigs
). Esta función es necesaria para el modo de transferencia HIDL, que ConfigStore no utiliza. - 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 }
- Modifique el archivo
Android.mk
para agregar el archivo de implementación (modulename Configs.cpp
) aLOCAL_SRC_FILES
y asignar indicadores de compilación a definiciones de macro. Por ejemplo, enhardware/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
- (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>
- 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, ensystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Agregar nuevos elementos de ConfigStore
Para agregar un nuevo elemento de ConfigStore:
- Abra el archivo HAL y agregue el método de interfaz requerido para el artículo. (Los archivos
.hal
para ConfigStore residen enhardware/interfaces/configstore/1.0
). Por ejemplo, enhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- Implemente el método en los archivos de implementación HAL de la interfaz correspondiente (
.h
y.cpp
). Coloque las implementaciones predeterminadas enhardware/interfaces/configstore/1.0/default
. Por ejemplo, enhardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
y enhardware/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(); }
Usando elementos de ConfigStore
Para utilizar un elemento de ConfigStore:
- 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>
- Acceda al elemento ConfigStore usando la función de plantilla adecuada en
android.hardware.configstore-utils
. Por ejemplo, ensystem/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 ConfigStoredisableInitBlank
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. - Agregue la dependencia de ConfigStore y la biblioteca
configstore-utils
enAndroid.mk
oAndroid.bp
. Por ejemplo, ensystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \