Vous pouvez ajouter des éléments ConfigStore (c'est-à-dire des méthodes d'interface) à une classe d'interface existante. Si la classe d'interface n'est pas définie, vous devez ajouter une nouvelle classe avant de pouvoir ajouter un élément ConfigStore pour cette classe. Cette section utilise l'exemple d'un élément de configuration disableInitBlank
pour healthd
ajouté à la classe d'interface IChargerConfigs
.
Ajouter des classes d'interface
Si aucune classe d'interface n'est définie pour la méthode d'interface que vous souhaitez ajouter, vous devez ajouter la classe d'interface avant de pouvoir ajouter les éléments ConfigStore associés.
- Créez un fichier d'interface HAL. La version de ConfigStore est la version 1.0. Définissez donc les interfaces ConfigStore dans
hardware/interfaces/configstore/1.0
. Par exemple, danshardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- Mettez à jour
Android.bp
etAndroid.mk
pour la bibliothèque partagée et les fichiers d'en-tête ConfigStore afin d'inclure la nouvelle interface HAL. Par exemple :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
etAndroid.mk
danshardware/interfaces/configstore/1.0
. - Générez le bouchon C++ pour implémenter le code du serveur. Par exemple :
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
Cette commande crée deux fichiers,ChargerConfigs.h
etChargerConfigs.cpp
, danshardware/interfaces/configstore/1.0/default
. - Ouvrez les fichiers d'implémentation
.h
et.cpp
, puis supprimez le code lié à la fonctionHIDL_FETCH_name
(par exemple,HIDL_FETCH_IChargerConfigs
). Cette fonction est nécessaire pour le mode passthrough HIDL, qui n'est pas utilisé par ConfigStore. - Enregistrez l'implémentation dans le service ConfigStore. Par exemple, dans
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 }
- Modifiez le fichier
Android.mk
pour ajouter le fichier d'implémentation (modulenameConfigs.cpp
) àLOCAL_SRC_FILES
et pour mapper les options de compilation en définitions de macro. Par exemple, danshardware/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
- (Facultatif) Ajoutez une entrée de fichier manifeste. Si ce n'est pas le cas, utilisez par défaut le nom d'instance "par défaut" de ConfigStore. Par exemple, dans
device/google/marlin/manifest.xml
:<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- Ajoutez la règle sepolicy si nécessaire (c'est-à-dire, si le client ne dispose pas des autorisations nécessaires pour effectuer des appels hwbinder à
hal_configstore
). Par exemple, danssystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Ajouter des éléments ConfigStore
Pour ajouter un élément ConfigStore:
- Ouvrez le fichier HAL et ajoutez la méthode d'interface requise pour l'élément. (Les fichiers
.hal
pour ConfigStore se trouvent danshardware/interfaces/configstore/1.0
.) Par exemple, danshardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- Implémentez la méthode dans les fichiers d'implémentation HAL de l'interface correspondante (
.h
et.cpp
). Placez les implémentations par défaut danshardware/interfaces/configstore/1.0/default
. Par exemple, danshardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
Et danshardware/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(); }
Utiliser des éléments ConfigStore
Pour utiliser un élément ConfigStore:
- Incluez les fichiers d'en-tête obligatoires. Par exemple, dans
system/core/healthd/healthd.cpp
:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- Accédez à l'élément ConfigStore à l'aide de la fonction de modèle appropriée dans
android.hardware.configstore-utils
. Par exemple, danssystem/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);
Dans cet exemple, l'élémentdisableInitBlank
ConfigStore est récupéré et stocké dans une variable (utile lorsque la variable doit être accessible plusieurs fois). La valeur récupérée à partir de ConfigStore est mise en cache dans la fonction de modèle instanciée afin qu'elle puisse être récupérée rapidement à partir de la valeur mise en cache sans contacter le service ConfigStore pour les appels ultérieurs à la fonction de modèle instanciée. - Ajoutez la dépendance à ConfigStore et à la bibliothèque
configstore-utils
dansAndroid.mk
ouAndroid.bp
. Par exemple, danssystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \