ConfigStore-Klassen und ‑Elemente hinzufügen

Sie können einer vorhandenen Schnittstellenklasse neue ConfigStore-Elemente (d. h. Schnittstellenmethoden) hinzufügen. Wenn die Benutzeroberflächenklasse nicht definiert ist, müssen Sie eine neue Klasse hinzufügen, bevor Sie ein ConfigStore-Element für diese Klasse hinzufügen können. In diesem Abschnitt wird das Beispiel eines disableInitBlank-Konfigurationselements für healthd verwendet, das der IChargerConfigs-Schnittstellenklasse hinzugefügt wird.

Benutzeroberflächenklassen hinzufügen

Wenn für die hinzuzufügende Schnittstellenmethode keine Schnittstellenklasse definiert ist, müssen Sie die Schnittstellenklasse hinzufügen, bevor Sie die zugehörigen ConfigStore-Elemente hinzufügen können.

  1. Erstellen Sie eine HAL-Schnittstellendatei. Die ConfigStore-Version ist 1.0. Definieren Sie daher ConfigStore-Schnittstellen in hardware/interfaces/configstore/1.0. Beispiel: In 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 freigegebene ConfigStore-Bibliothek und die Headerdateien, um die neue HAL-Schnittstelle aufzunehmen. Beispiel:
    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 aktualisiert.
  3. Erstellen Sie den C++-Stub zur Implementierung des Servercodes. Beispiel:
    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
    
    Mit diesem Befehl werden zwei Dateien, ChargerConfigs.h und ChargerConfigs.cpp, in hardware/interfaces/configstore/1.0/default erstellt.
  4. Öffnen Sie die Implementierungsdateien .h und .cpp und entfernen Sie den Code, der sich auf die Funktion HIDL_FETCH_name bezieht (z. B. HIDL_FETCH_IChargerConfigs). Diese Funktion ist für den HIDL-Passthrough-Modus erforderlich, der von ConfigStore nicht verwendet wird.
  5. Registrieren Sie die Implementierung beim ConfigStore-Dienst. Beispielsweise in 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 LOCAL_SRC_FILES die Implementierungsdatei (modulenameConfigs.cpp) hinzuzufügen und Build-Flags Makrodefinitionen zuzuordnen. Beispielsweise in 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. Wenn sie nicht vorhanden ist, wird standardmäßig der Instanzname „default“ von ConfigStore verwendet. Beispielsweise in 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 die Sepolicy-Regel hinzu, falls erforderlich, d. h., wenn der Client keine Berechtigungen zum Ausführen von hwbinder-Aufrufen an hal_configstore hat. Beispiel in 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 Schnittstellenmethode für das Element hinzu. Die .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. Beispielsweise in 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. Beispielsweise in system/core/healthd/healthd.cpp:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Rufe das ConfigStore-Element mit der entsprechenden Vorlagenfunktion in android.hardware.configstore-utils auf. Beispielsweise in 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. Das ist nützlich, wenn mehrmals auf die Variable zugegriffen werden muss. Der aus dem ConfigStore abgerufene Wert wird in der instanziierten Vorlagenfunktion im Cache gespeichert, damit er schnell aus dem Cache abgerufen werden kann, ohne dass bei späteren Aufrufen der instanziierten Vorlagenfunktion der ConfigStore-Dienst kontaktiert werden muss.
  3. Fügen Sie die Abhängigkeit von ConfigStore und der configstore-utils-Bibliothek in Android.mk oder Android.bp hinzu. Beispielsweise in system/core/healthd/Android.mk:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \