Hinzufügen von ConfigStore-Klassen und -Elementen

Sie können neue ConfigStore-Elemente (d. h. Schnittstellenmethoden) für eine vorhandene Schnittstellenklasse hinzufügen. Wenn die Schnittstellenklasse 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 Konfigurationselements disableInitBlank für healthd verwendet, das der Schnittstellenklasse IChargerConfigs hinzugefügt wird.

Schnittstellenklassen hinzufügen

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

  1. Erstellen Sie eine HAL-Schnittstellendatei. Die ConfigStore-Version ist 1.0, also definieren Sie ConfigStore-Schnittstellen in hardware/interfaces/configstore/1.0 . Zum Beispiel in hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Aktualisieren Android.bp und Android.mk für die gemeinsam genutzte ConfigStore-Bibliothek und die Header-Dateien, um die neue HAL-Schnittstelle einzuschließen. 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
    
    Diese Befehle aktualisieren Android.bp und Android.mk in hardware/interfaces/configstore/1.0 .
  3. Generieren Sie den C++-Stub zum Implementieren 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
    
    Dieser Befehl erstellt zwei Dateien, ChargerConfigs.h und ChargerConfigs.cpp , in hardware/interfaces/configstore/1.0/default .
  4. Öffnen Sie die .h und .cpp Implementierungsdateien und entfernen Sie den Code, der sich auf den Namen der Funktion HIDL_FETCH_ name (z. B. HIDL_FETCH_IChargerConfigs ). Diese Funktion wird für den HIDL-Passthrough-Modus benötigt, der von ConfigStore nicht verwendet wird.
  5. Registrieren Sie die Implementierung beim ConfigStore-Dienst. Zum Beispiel 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 die Implementierungsdatei ( modulename Configs.cpp ) zu LOCAL_SRC_FILES und Build-Flags Makrodefinitionen zuzuordnen. Zum Beispiel 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 er nicht vorhanden ist, verwenden Sie standardmäßig den „Standard“-Instanznamen von ConfigStore. Zum Beispiel 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 bei Bedarf die sepolicy-Regel hinzu (das heißt, wenn der Client keine Berechtigungen zum Durchführen von hwbinder-Aufrufen an hal_configstore ). Zum Beispiel in system/sepolicy/private/healthd.te :
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Hinzufügen neuer ConfigStore-Elemente

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 .) Zum Beispiel in 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 Schnittstellen-HAL-Implementierungsdateien ( .h und .cpp ). Platzieren Sie die Standardimplementierungen in hardware/interfaces/configstore/1.0/default . Zum Beispiel 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();
    }
    

Verwenden von ConfigStore-Elementen

So verwenden Sie ein ConfigStore-Element:

  1. Schließen Sie die erforderlichen Header-Dateien ein. Zum Beispiel in system/core/healthd/healthd.cpp :
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Greifen Sie über die entsprechende Vorlagenfunktion in android.hardware.configstore-utils auf das ConfigStore-Element zu. Beispiel: 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 (nützlich, wenn auf die Variable mehrmals zugegriffen werden muss). Der aus dem ConfigStore abgerufene Wert wird in der instanziierten Vorlagenfunktion zwischengespeichert, sodass er schnell aus dem zwischengespeicherten Wert abgerufen werden kann, ohne den ConfigStore-Dienst für spätere Aufrufe der instanziierten Vorlagenfunktion zu kontaktieren.
  3. Fügen Sie die Abhängigkeit von ConfigStore und der Bibliothek configstore-utils in Android.mk oder Android.bp . Zum Beispiel in system/core/healthd/Android.mk :
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \