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.
- 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 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
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 para asignar indicadores de compilación en 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)
Adición de nuevos elementos de ConfigStore
Para agregar un nuevo elemento de ConfigStore:
- Abra el archivo HAL y agregue el método de interfaz necesario para el elemento. (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(); }
Uso de 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 mediante 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 elementodisableInitBlank
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. - Agregue la dependencia en 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) \