Sie können einer vorhandenen Schnittstellenklasse neue ConfigStore-Elemente (d. h. Schnittstellenmethoden) 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 disableInitBlank-Konfigurationselements für healthd verwendet, das der IChargerConfigs-Schnittstellenklasse 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 zugehörigen ConfigStore-Elemente hinzufügen können.
- Erstellen Sie eine HAL-Schnittstellendatei. Die ConfigStore-Version ist 1.0. Definieren Sie daher ConfigStore-Schnittstellen in hardware/interfaces/configstore/1.0. Beispiel: Inhardware/interfaces/configstore/1.0/IChargerConfigs.hal:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- Aktualisieren Sie Android.bpundAndroid.mkfür die ConfigStore-Shared Library und 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::IChargerConfigshidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigsAndroid.bpundAndroid.mkinhardware/interfaces/configstore/1.0aktualisiert.
- Generieren Sie den C++-Stub für die 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 ChargerConfigs.hundChargerConfigs.cpp, inhardware/interfaces/configstore/1.0/defaulterstellt.
- Öffnen Sie die Implementierungsdateien .hund.cppund entfernen Sie den Code, der sich auf die FunktionHIDL_FETCH_namebezieht (z. B.HIDL_FETCH_IChargerConfigs). Diese Funktion ist für den HIDL-Passthrough-Modus erforderlich, der von ConfigStore nicht verwendet wird.
- Registrieren Sie die Implementierung beim ConfigStore-Dienst. Beispiel für 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 }
- Ändern Sie die Datei Android.mk, um die Implementierungsdatei (modulenameConfigs.cpp) zuLOCAL_SRC_FILEShinzuzufügen und Build-Flags Makrodefinitionen zuzuordnen. Beispiel fürhardware/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 
- Optional: Fügen Sie einen Manifesteintrag hinzu. Wenn sie nicht vorhanden ist, wird standardmäßig der Instanzname „default“ von ConfigStore verwendet. Beispiel für device/google/marlin/manifest.xml:<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- Fügen Sie die sepolicy-Regel bei Bedarf hinzu (d. h., wenn der Client keine Berechtigungen für hwbinder-Aufrufe an hal_configstorehat). Beispiel insystem/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:
- Ö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 inhardware/interfaces/configstore/1.0, z. B. inhardware/interfaces/configstore/1.0/IChargerConfigs.hal:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- Implementieren Sie die Methode in den entsprechenden HAL-Implementierungsdateien der Schnittstelle (.hund.cpp). Platzieren Sie die Standardimplementierungen inhardware/interfaces/configstore/1.0/default. Beispiel fürhardware/interfaces/configstore/1.0/default/ChargerConfigs.h:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };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:
- Fügen Sie die erforderlichen Headerdateien ein. Beispiel für system/core/healthd/healthd.cpp:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h> 
- Greifen Sie mit der entsprechenden Vorlagenfunktion in android.hardware.configstore-utilsauf das ConfigStore-Element zu. Beispiel fürsystem/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);disableInitBlankabgerufen 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, sodass er bei späteren Aufrufen der instanziierten Vorlagenfunktion schnell aus dem Cache abgerufen werden kann, ohne dass der ConfigStore-Dienst kontaktiert werden muss.
- Fügen Sie die Abhängigkeit von ConfigStore und der configstore-utils-Bibliothek inAndroid.mkoderAndroid.bphinzu. Beispiel fürsystem/core/healthd/Android.mk:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \
