Puedes 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, 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
.
Cómo agregar 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.
- 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, enhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- Actualiza
Android.bp
yAndroid.mk
de la biblioteca compartida de ConfigStore y los archivos de encabezado para incluir la HAL de la interfaz nueva. 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
. - 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
yChargerConfigs.cpp
, enhardware/interfaces/configstore/1.0/default
. - Abre los archivos de implementación
.h
y.cpp
, y quita 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 no se usa en ConfigStore. - Registra 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 }
- Modifica el archivo
Android.mk
para agregar el archivo de implementación (modulenameConfigs.cpp
) aLOCAL_SRC_FILES
y asignar marcas 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
- Agrega una entrada de manifiesto (opcional). Si no existe, usa el nombre de instancia “default” de ConfigStore de forma predeterminada. 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>
- Agrega la regla de políticas si es necesario (es decir, si el cliente no tiene permisos para realizar llamadas a
hal_configstore
). Por ejemplo, ensystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
.
Agregar elementos nuevos de ConfigStore
Para agregar un elemento de ConfigStore nuevo, sigue estos pasos:
- Abre el archivo HAL y agrega el método de interfaz requerido para el elemento. (Los archivos
.hal
de 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); };
- Implementa el método en los archivos de implementación de HAL de la interfaz correspondientes (
.h
y.cpp
). Coloca 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(); }
Usa elementos de ConfigStore
Para usar un elemento ConfigStore, sigue estos pasos:
- 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>
- Accede al elemento de ConfigStore con 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, se recupera el elementodisableInitBlank
de ConfigStore y se almacena en una variable (es ú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 de la instancia para que se pueda recuperar rápidamente desde el valor almacenado en caché sin contactar al servicio de ConfigStore para llamadas posteriores a la función de plantilla de la instancia. - Agrega 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) \