Ab dem 27. März 2025 empfehlen wir, android-latest-release anstelle von aosp-main zu verwenden, um AOSP zu erstellen und Beiträge dazu zu leisten. Weitere Informationen finden Sie unter Änderungen am AOSP.
Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
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.
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:
Aktualisieren Sie Android.bp und Android.mk für die freigegebene ConfigStore-Bibliothek und die Headerdateien, um die neue HAL-Schnittstelle einzubeziehen.
Beispiel:
Mit diesem Befehl werden zwei Dateien, ChargerConfigs.h und ChargerConfigs.cpp, in hardware/interfaces/configstore/1.0/default erstellt.
Ö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.
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
}
Ä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:
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:
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:
Ö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
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:
Fügen Sie die erforderlichen Headerdateien hinzu. Beispielsweise in system/core/healthd/healthd.cpp:
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 Cachewert abgerufen werden kann, ohne bei späteren Aufrufen der instanziierten Vorlagenfunktion den ConfigStore-Dienst zu kontaktieren.
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:
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2025-07-26 (UTC).
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Benötigte Informationen nicht gefunden","missingTheInformationINeed","thumb-down"],["Zu umständlich/zu viele Schritte","tooComplicatedTooManySteps","thumb-down"],["Nicht mehr aktuell","outOfDate","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Problem mit Beispielen/Code","samplesCodeIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 2025-07-26 (UTC)."],[],[],null,["# Add ConfigStore classes and items\n\n| **Warning:** Android 10 deprecates the ConfigStore HAL and replaces the HAL with system properties. For details, refer to [Configuring](/docs/core/architecture/configuration).\n\nYou can add new ConfigStore items (that is, interface methods) for an\nexisting interface class. If the interface class isn't defined, you must add a\nnew class before you can add a ConfigStore item for that class. This section\nuses the example of a `disableInitBlank` configuration item for\n`healthd` being added to the `IChargerConfigs` interface\nclass.\n| **Note:** Before continuing, ensure that you're familiar with [general HIDL\n| concepts](/docs/core/architecture/hidl), [HIDL C++\n| development workflow](/docs/core/architecture/hidl-cpp), [HIDL Code Style](/docs/core/architecture/hidl/code-style), and [ConfigStore design](/docs/core/architecture/configstore).\n\nAdd interface classes\n---------------------\n\nIf no interface class is defined for the interface method that you want to\nadd, you must add the interface class before you can add the associated\nConfigStore items.\n\n1. Create a HAL interface file. The ConfigStore version is 1.0, so define ConfigStore interfaces in `hardware/interfaces/configstore/1.0`. For example, in `hardware/interfaces/configstore/1.0/IChargerConfigs.hal`: \n\n ```\n package android.hardware.configstore@1.0;\n\n interface IChargerConfigs {\n // TO-BE-FILLED-BELOW\n };\n ```\n2. Update `Android.bp` and `Android.mk` for the ConfigStore shared library and header files to include the new interface HAL. For example: \n\n 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\n 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\n\n These commands update `Android.bp` and `Android.mk` in `hardware/interfaces/configstore/1.0`.\n3. Generate the C++ stub for implementing the server code. For example: \n\n ```\n 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\n ```\n This command creates two files, `ChargerConfigs.h` and `ChargerConfigs.cpp`, in `hardware/interfaces/configstore/1.0/default`.\n4. Open the `.h` and `.cpp` implementation files and remove code related to the function `HIDL_FETCH_`\u003cvar translate=\"no\"\u003ename\u003c/var\u003e (for example, `HIDL_FETCH_IChargerConfigs`). This function is needed for HIDL passthrough mode, which isn't used by ConfigStore.\n5. Register the implementation to the ConfigStore service. For example, in `hardware/interfaces/configstore/1.0/default/service.cpp`: \n\n ```\n #include \u003candroid/hardware/configstore/1.0/IChargerConfigs.h\u003e\n #include \"ChargerConfigs.h\"\n\n using android::hardware::configstore::V1_0::IChargerConfigs;\n using android::hardware::configstore::V1_0::implementation::ChargerConfigs;\n\n int main() {\n ... // other code\n sp\u003cIChargerConfigs\u003e chargerConfigs = new ChargerConfigs;\n status = chargerConfigs-\u003eregisterAsService();\n LOG_ALWAYS_FATAL_IF(status != OK, \"Could not register IChargerConfigs\");\n ... // other code\n }\n ```\n6. Modify the `Android.mk` file to add the implementation file (\u003cvar translate=\"no\"\u003emodulename\u003c/var\u003e`Configs.cpp`) to `LOCAL_SRC_FILES` and to map build flags into macro definitions. For example, in `hardware/interfaces/configstore/1.0/default/Android.mk`: \n\n ```\n LOCAL_SRC_FILES += ChargerConfigs.cpp\n\n ifeq ($(strip $(BOARD_CHARGER_DISABLE_INIT_BLANK)),true)\n LOCAL_CFLAGS += -DCHARGER_DISABLE_INIT_BLANK\n endif\n ```\n7. (Optional) Add a manifest entry. If it doesn't exist, default to the \"default\" instance name of ConfigStore. For example, in `device/google/marlin/manifest.xml`: \n\n ```\n \u003chal format=\"hidl\"\u003e\n \u003cname\u003eandroid.hardware.configstore\u003c/name\u003e\n ...\n \u003cinterface\u003e\n \u003cname\u003eIChargerConfigs\u003c/name\u003e\n \u003cinstance\u003edefault\u003c/instance\u003e\n \u003c/interface\u003e\n \u003c/hal\u003e\n ```\n8. Add the sepolicy rule if needed (that is, if the client doesn't have permissions for making hwbinder calls to `hal_configstore`). For example, in `system/sepolicy/private/healthd.te`: \n\n ```\n ... // other rules\n binder_call(healthd, hal_configstore)\n ```\n\nAdd new ConfigStore items\n-------------------------\n\nTo add a new ConfigStore item:\n\n1. Open the HAL file and add the required interface method for the item. (The `.hal` files for ConfigStore reside in `hardware/interfaces/configstore/1.0`.) For example, in `hardware/interfaces/configstore/1.0/IChargerConfigs.hal`: \n\n ```\n package android.hardware.configstore@1.0;\n\n interface IChargerConfigs {\n ... // Other interfaces\n disableInitBlank() generates(OptionalBool value);\n };\n ```\n2. Implement the method in the corresponding interface HAL implementation files (`.h` and `.cpp`). Place the default implementations in `hardware/interfaces/configstore/1.0/default`. **Note:** Running `hidl-gen` with `-Lc++-impl` generates skeleton code for the newly added interface method. However, it also overwrites implementations for all existing interface methods, so use the `-o` option appropriately.\n For example, in `hardware/interfaces/configstore/1.0/default/ChargerConfigs.h`: \n\n ```\n struct ChargerConfigs : public IChargerConfigs {\n ... // Other interfaces\n Return\u003cvoid\u003e disableInitBlank(disableInitBlank_cb _hidl_cb) override;\n };\n ```\n And in `hardware/interfaces/configstore/1.0/default/ChargerConfigs.cpp`: \n\n ```\n Return\u003cvoid\u003e ChargerConfigs::disableInitBlank(disableInitBlank_cb _hidl_cb) {\n bool value = false;\n #ifdef CHARGER_DISABLE_INIT_BLANK\n value = true;\n #endif\n _hidl_cb({true, value});\n return Void();\n }\n ```\n\nUse ConfigStore items\n---------------------\n\nTo use a ConfigStore item:\n\n1. Include the required header files. For example, in `system/core/healthd/healthd.cpp`: \n\n ```\n #include \u003candroid/hardware/configstore/1.0/IChargerConfigs.h\u003e\n #include \u003cconfigstore/Utils.h\u003e\n ```\n2. Access the ConfigStore item using the appropriate template function in `android.hardware.configstore-utils`. For example, in `system/core/healthd/healthd.cpp`: \n\n ```\n using namespace android::hardware::configstore;\n using namespace android::hardware::configstore::V1_0;\n\n static int64_t disableInitBlank = getBool\u003c\n IChargerConfigs,\n &IChargerConfigs::disableInitBlank\u003e(false);\n ```\n In this example, the ConfigStore item `disableInitBlank` is retrieved and stored to a variable (useful when the variable needs to be accessed multiple times). The value retrieved from the ConfigStore is cached inside the instantiated template function so that it can be retrieved quickly from the cached value without contacting the ConfigStore service for later calls to the instantiated template function.\n3. Add the dependency on ConfigStore and the `configstore-utils` library in `Android.mk` or `Android.bp`. For example, in `system/core/healthd/Android.mk`: \n\n ```\n LOCAL_SHARED_LIBRARIES := \\\n android.hardware.configstore@1.0 \\\n android.hardware.configstore-utils \\\n ... (other libraries) \\\n ```"]]