Ajout de classes et d'éléments ConfigStore

Vous pouvez ajouter de nouveaux éléments ConfigStore (c'est-à-dire des méthodes d'interface) pour 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 .

Ajout de 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.

  1. Créez un fichier d'interface HAL. La version ConfigStore est 1.0, définissez donc les interfaces ConfigStore dans hardware/interfaces/configstore/1.0 . Par exemple, dans hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Mettez à jour Android.bp et Android.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
    
    Ces commandes mettent à jour Android.bp et Android.mk dans hardware/interfaces/configstore/1.0 .
  3. Générez le stub 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 et ChargerConfigs.cpp , dans hardware/interfaces/configstore/1.0/default .
  4. Ouvrez les fichiers d'implémentation .h et .cpp et supprimez le code lié à la fonction HIDL_FETCH_ name (par exemple, HIDL_FETCH_IChargerConfigs ). Cette fonction est nécessaire pour le mode relais HIDL, qui n'est pas utilisé par ConfigStore.
  5. Enregistrez l'implémentation auprès du 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
    }
    
  6. Modifiez le fichier Android.mk pour ajouter le fichier d'implémentation ( modulename Configs.cpp ) à LOCAL_SRC_FILES et pour mapper les indicateurs de build dans les définitions de macro. Par exemple, dans hardware/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
    
  7. (Facultatif) Ajoutez une entrée de manifeste. S'il n'existe pas, 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>
    
  8. Ajoutez la règle de sécurité 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, dans system/sepolicy/private/healthd.te :
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Ajout de nouveaux éléments ConfigStore

Pour ajouter un nouvel élément ConfigStore :

  1. Ouvrez le fichier HAL et ajoutez la méthode d'interface requise pour l'élément. (Les fichiers .hal pour ConfigStore résident dans hardware/interfaces/configstore/1.0 .) Par exemple, dans hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Implémentez la méthode dans les fichiers d'implémentation HAL de l'interface correspondants ( .h et .cpp ). Placez les implémentations par défaut dans hardware/interfaces/configstore/1.0/default . Par exemple, dans hardware/interfaces/configstore/1.0/default/ChargerConfigs.h :
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    Et dans 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();
    }
    

Utiliser les éléments du ConfigStore

Pour utiliser un élément ConfigStore :

  1. Incluez les fichiers d'en-tête requis. Par exemple, dans system/core/healthd/healthd.cpp :
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Accédez à l'élément ConfigStore à l'aide de la fonction de modèle appropriée dans android.hardware.configstore-utils . Par exemple, dans system/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ément ConfigStore disableInitBlank est récupéré et stocké dans une variable (utile lorsque la variable doit être accédée plusieurs fois). La valeur récupérée du 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 des appels ultérieurs à la fonction de modèle instanciée.
  3. Ajoutez la dépendance sur ConfigStore et la bibliothèque configstore-utils dans Android.mk ou Android.bp . Par exemple, dans system/core/healthd/Android.mk :
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \