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 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
. Beispielsweise 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 gemeinsam genutzte ConfigStore-Bibliothek und die Header-Dateien, um die neue Schnittstelle HAL 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
Android.bp
undAndroid.mk
inhardware/interfaces/configstore/1.0
. - Generieren 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
Dieser Befehl erstellt zwei Dateien,ChargerConfigs.h
undChargerConfigs.cpp
, inhardware/interfaces/configstore/1.0/default
. - Öffnen Sie die
.h
und.cpp
Implementierungsdateien und entfernen Sie Code im Zusammenhang mit dem FunktionsnamenHIDL_FETCH_ name
(z. B.HIDL_FETCH_IChargerConfigs
). Diese Funktion wird für den HIDL-Passthrough-Modus benötigt, der von ConfigStore nicht verwendet wird. - 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 }
- Ändern Sie die Datei
Android.mk
, um die Implementierungsdatei (modulename Configs.cpp
) zuLOCAL_SRC_FILES
hinzuzufügen und Build-Flags Makrodefinitionen zuzuordnen. Zum 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 er nicht vorhanden ist, verwenden Sie standardmäßig den „Standard“-Instanznamen von ConfigStore. Beispielsweise 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 bei Bedarf die Sepolicy-Regel hinzu (d. h. wenn der Client keine Berechtigungen zum Durchführen von Hwbinder-Aufrufen an
hal_configstore
hat). Beispielsweise 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
.) Beispielsweise 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 Schnittstellen-HAL-Implementierungsdateien (
.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(); }
Verwenden von ConfigStore-Elementen
So verwenden Sie ein ConfigStore-Element:
- Fügen Sie die erforderlichen Header-Dateien hinzu. Beispielsweise in
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-utils
auf das ConfigStore-Element zu. Beispielsweise 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 (nützlich, wenn auf die Variable mehrmals zugegriffen werden muss). Der aus dem ConfigStore abgerufene Wert wird innerhalb 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 kontaktieren zu müssen. - Fügen Sie die Abhängigkeit von ConfigStore und der
configstore-utils
Bibliothek inAndroid.mk
oderAndroid.bp
hinzu. Beispielsweise insystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \