Puedes agregar nuevos elementos de ConfigStore (es decir, métodos de interfaz) para un
clase de interfaz existente. Si no se definió la clase de interfaz, debes agregar una
nueva clase antes de que puedas agregar un elemento ConfigStore para esa clase. Esta sección
usa el ejemplo de un elemento de configuración disableInitBlank
para
Se agregará healthd
a la interfaz IChargerConfigs
.
Cómo agregar clases de interfaz
Si no se define ninguna clase de interfaz para el método de interfaz que quieres agregar, debes agregar la clase de interfaz antes de agregar la clase ConfigStore.
- Crea un archivo de interfaz de HAL. La versión de ConfigStore es 1.0, así que define
Interfaces de ConfigStore en
hardware/interfaces/configstore/1.0
. Para 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
para la La biblioteca compartida de ConfigStore y los archivos de encabezado para incluir la HAL de la nueva interfaz Por ejemplo: Estos comandos actualizanhidl-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:
Este comando crea dos archivos,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
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
(para ejemplo,HIDL_FETCH_IChargerConfigs
). Esta función es necesaria para Es el modo de transferencia de HIDL, que ConfigStore no usa. - 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, elige la opción
“predeterminado” el nombre de la instancia 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>
- Agrega la regla de sepolicy si es necesario (es decir, si el cliente no tiene
permisos para realizar llamadas de hwbinder a
hal_configstore
). Para 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. (El
Los archivos
.hal
del ConfigStore se encuentran 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 la 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
: Y enstruct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
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 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 ConfigStore usando la función de plantilla adecuada en
android.hardware.configstore-utils
Por ejemplo, ensystem/core/healthd/healthd.cpp
: En este ejemplo, se recupera el elementousing namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
disableInitBlank
de ConfigStore y se almacenan en una variable (es útil cuando es necesario acceder a la variable varias veces). El valor recuperado de ConfigStore se almacena en caché se creó una instancia de la función de plantilla para que se pueda recuperar rápidamente valor almacenado en caché sin comunicarse con el servicio ConfigStore para llamadas posteriores al se creó una instancia de la función de plantilla. - Agrega la dependencia en ConfigStore y
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) \