Sie können neue ConfigStore-Elemente (d. h. Schnittstellenmethoden) für eine vorhandene Schnittstellenklasse 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 Methode, 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.bp
undAndroid.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
Android.bp
undAndroid.mk
inhardware/interfaces/configstore/1.0
aktualisiert. - 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
undChargerConfigs.cpp
, inhardware/interfaces/configstore/1.0/default
erstellt. - Öffnen Sie die Implementierungsdateien
.h
und.cpp
und entfernen Sie den Code, der sich auf die FunktionHIDL_FETCH_name
bezieht (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 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 }
- Ändern Sie die Datei
Android.mk
so, dass die Implementierungsdatei (modulenameConfigs.cpp
) inLOCAL_SRC_FILES
eingefügt wird und Build-Flags den Makrodefinitionen zugeordnet werden. Beispiel inhardware/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 die Instanz nicht vorhanden ist, wird standardmäßig der Instanzname „default“ von ConfigStore verwendet. Beispiel in
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 hinzu, falls erforderlich, d. h. wenn der Client keine Berechtigungen zum Ausführen von hwbinder-Aufrufen an
hal_configstore
hat. 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
. Beispiel:hardware/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 (
.h
und.cpp
). Platzieren Sie die Standardimplementierungen inhardware/interfaces/configstore/1.0/default
. Zum Beispiel inhardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
Und inhardware/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 hinzu. Beispiel in
system/core/healthd/healthd.cpp
:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- Rufen Sie das ConfigStore-Element mit der entsprechenden Vorlagenfunktion in
android.hardware.configstore-utils
auf. Beispiel insystem/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-ElementdisableInitBlank
abgerufen und in einer Variablen gespeichert. Das ist nützlich, wenn auf die Variable mehrmals 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. - Fügen Sie die Abhängigkeit von ConfigStore und der
configstore-utils
-Bibliothek inAndroid.mk
oderAndroid.bp
hinzu. Beispiel insystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \