Ajouter des classes et des éléments ConfigStore

Vous pouvez ajouter de nouveaux éléments ConfigStore (c'est-à-dire des méthodes d'interface) pour une la 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 Ajout de healthd à l'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 vous devez ajouter la classe d'interface avant de pouvoir ajouter la classe ConfigStore.

  1. Créez un fichier d'interface HAL. La version de ConfigStore est 1.0, vous devez donc définir Interfaces ConfigStore dans hardware/interfaces/configstore/1.0 Pour 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 Bibliothèque partagée ConfigStore et fichiers d'en-tête pour 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 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 et ChargerConfigs.cpp dans hardware/interfaces/configstore/1.0/default
  4. Ouvrez les fichiers d'implémentation .h et .cpp, puis supprimez le code associé à la fonction HIDL_FETCH_name (par (HIDL_FETCH_IChargerConfigs, par exemple). Cette fonction est nécessaire pour Mode passthrough HIDL, qui n'est pas utilisé par ConfigStore.
  5. 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
    }
    
  6. Modifiez le fichier Android.mk pour ajouter le fichier d'implémentation. (modulenameConfigs.cpp) vers LOCAL_SRC_FILES et pour mapper des indicateurs de compilation dans des 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 fichier manifeste. S'il n'existe pas, le paramètre par défaut est "par défaut" nom d'instance 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 sepolicy si nécessaire (c'est-à-dire, si le client n'a pas autorisations permettant d'effectuer des appels de liaison à hal_configstore). Pour exemple dans system/sepolicy/private/healthd.te:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Ajouter des éléments ConfigStore

Pour ajouter un élément ConfigStore:

  1. Ouvrez le fichier HAL et ajoutez la méthode d'interface requise pour l'élément. (Le .hal fichiers pour ConfigStore résident 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 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 des éléments 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ées dans une variable (utile lorsque plusieurs personnes doivent accéder à la variable fois). La valeur récupérée à partir de ConfigStore est mise en cache dans le de modèle instanciée afin de pouvoir la récupérer rapidement mise en cache sans contacter le service ConfigStore pour les appels ultérieurs une fonction de modèle instanciée.
  3. Ajoutez la dépendance à ConfigStore et à configstore-utils. bibliothèque 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) \