ConfigStore-Klassen und -Elemente hinzufügen

<ph type="x-smartling-placeholder">

Sie können neue ConfigStore-Elemente (d. h. Schnittstellenmethoden) für eine der vorhandenen Interface-Klasse. Ist die Schnittstellenklasse nicht definiert, müssen Sie einen neue Klasse hinzu, bevor Sie ein ConfigStore-Element für diese Klasse hinzufügen können. Dieser Abschnitt das Beispiel eines disableInitBlank-Konfigurationselements healthd wird der IChargerConfigs-Benutzeroberfläche hinzugefügt .

Oberflächenklassen hinzufügen

Wenn für die gewünschte Interface-Methode keine Schnittstellenklasse definiert ist, hinzufügen, müssen Sie zuerst die Interface-Klasse hinzufügen, bevor Sie die zugehörigen ConfigStore-Elemente.

  1. Erstellen Sie eine HAL-Schnittstellendatei. Die ConfigStore-Version ist 1.0, also definieren Sie ConfigStore-Schnittstellen in hardware/interfaces/configstore/1.0. Für Beispiel: hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Aktualisieren Sie Android.bp und Android.mk für die Die gemeinsam genutzte Bibliothek und Headerdateien von ConfigStore enthalten die neue HAL-Schnittstelle. Hier einige Beispiele:
    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
    
    Mit diesen Befehlen werden Android.bp und Android.mk in hardware/interfaces/configstore/1.0.
  3. Generieren Sie den C++-Stub, um den Servercode zu implementieren. Hier einige Beispiele:
    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
    
    Dieser Befehl erstellt zwei Dateien, ChargerConfigs.h und ChargerConfigs.cpp, in hardware/interfaces/configstore/1.0/default.
  4. Öffnen Sie die Implementierungsdateien für .h und .cpp und Entfernen Sie den Code für die Funktion HIDL_FETCH_name (für Beispiel: HIDL_FETCH_IChargerConfigs). Diese Funktion wird benötigt für HIDL-Passthrough-Modus, der nicht von ConfigStore verwendet wird.
  5. Registrieren Sie die Implementierung beim ConfigStore-Dienst. Beispiel: 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. Ändern Sie die Datei Android.mk, um die Implementierungsdatei hinzuzufügen (modulenameConfigs.cpp) nach LOCAL_SRC_FILES und Build-Flags in Makrodefinitionen. Beispiel: 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. Optional: Fügen Sie einen Manifesteintrag hinzu. Ist dies nicht der Fall, verwenden Sie standardmäßig das „Standard“ Instanzname von ConfigStore. Beispiel: device/google/marlin/manifest.xml:
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. Fügen Sie gegebenenfalls die sepolicy-Regel hinzu, d. h., wenn der Client keine Berechtigungen zum Ausführen von Hwbinder-Aufrufen an hal_configstore). Für Beispiel für system/sepolicy/private/healthd.te:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Neue ConfigStore-Elemente hinzufügen

So fügen Sie ein neues ConfigStore-Element hinzu:

  1. Öffnen Sie die HAL-Datei und fügen Sie die erforderliche Interface-Methode für das Element hinzu. Der Parameter .hal-Dateien für ConfigStore befinden sich in hardware/interfaces/configstore/1.0.) Beispiel: hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Implementieren Sie die Methode in den entsprechenden HAL-Implementierungsdateien der Schnittstelle. (.h und .cpp). Platzieren Sie die Standardimplementierungen in hardware/interfaces/configstore/1.0/default Beispiel: hardware/interfaces/configstore/1.0/default/ChargerConfigs.h:
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    Und in 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();
    }
    

ConfigStore-Elemente verwenden

So verwenden Sie ein ConfigStore-Element:

  1. Fügen Sie die erforderlichen Headerdateien hinzu. Beispiel: system/core/healthd/healthd.cpp:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Greifen Sie mit der entsprechenden Vorlagenfunktion in android.hardware.configstore-utils Beispiel: 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);
    
    In diesem Beispiel wird das ConfigStore-Element disableInitBlank abgerufen. und in einer Variablen gespeichert werden (nützlich, wenn mehrfach auf die Variable zugegriffen werden muss) Mal). Der aus dem ConfigStore abgerufene Wert wird im Cache instanziierte Vorlagenfunktion so, dass sie schnell aus dem Wert im Cache gespeichert werden, ohne den ConfigStore-Dienst für spätere Aufrufe der eine instanziierte Vorlagenfunktion.
  3. Fügen Sie die Abhängigkeit von ConfigStore und den configstore-utils hinzu. in Android.mk oder Android.bp. Beispiel: system/core/healthd/Android.mk:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \