Możesz dodawać nowe elementy ConfigStore (czyli metody interfejsu) do istniejącej klasy interfejsu. Jeśli klasa interfejsu nie jest zdefiniowana, przed dodaniem elementu ConfigStore dla tej klasy musisz dodać nową klasę. W tej sekcji używamy przykładu elementu konfiguracji disableInitBlank
, który jest dodawany do klasy interfejsu IChargerConfigs
.healthd
Dodawanie klas interfejsu
Jeśli dla metody interfejsu, którą chcesz dodać, nie jest zdefiniowana żadna klasa interfejsu, musisz dodać klasę interfejsu, zanim będziesz mieć możliwość dodania powiązanych elementów ConfigStore.
- Utwórz plik interfejsu HAL. Wersja ConfigStore to 1.0, więc zdefiniuj interfejsy ConfigStore w
hardware/interfaces/configstore/1.0
. Na przykład whardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- Zaktualizuj
Android.bp
iAndroid.mk
w przypadku biblioteki współdzielonej ConfigStore i plików nagłówkowych, aby uwzględnić nowy interfejs HAL. Na przykład: Te polecenia aktualizują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
iAndroid.mk
whardware/interfaces/configstore/1.0
. - Wygeneruj szkielet C++ do implementacji kodu serwera. Na przykład:
To polecenie tworzy 2 pliki: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.h
iChargerConfigs.cpp
, whardware/interfaces/configstore/1.0/default
. - Otwórz pliki implementacji
.h
i.cpp
i usuń kod związany z funkcjąHIDL_FETCH_name
(np.HIDL_FETCH_IChargerConfigs
). Ta funkcja jest potrzebna w trybie przekazywania HIDL, który nie jest używany przez ConfigStore. - Zarejestruj implementację w usłudze ConfigStore. Na przykład w przypadku:
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 }
- Zmodyfikuj plik
Android.mk
, aby dodać plik implementacji (modulenameConfigs.cpp
) doLOCAL_SRC_FILES
i zmapować flagi kompilacji na definicje makr. Na przykład w przypadku: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
- (Opcjonalnie) Dodaj wpis w pliku manifestu. Jeśli nie istnieje, domyślnie używana jest nazwa instancji „default” w usłudze ConfigStore. Na przykład w przypadku:
device/google/marlin/manifest.xml
<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- W razie potrzeby dodaj regułę sepolicy (czyli jeśli klient nie ma uprawnień do wykonywania wywołań hwbinder do
hal_configstore
). Na przykład wsystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Dodawanie nowych elementów ConfigStore
Aby dodać nowy element ConfigStore:
- Otwórz plik HAL i dodaj wymaganą metodę interfejsu dla elementu. (Pliki
.hal
dla ConfigStore znajdują się whardware/interfaces/configstore/1.0
). Na przykład whardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- Zaimplementuj metodę w odpowiednich plikach implementacji interfejsu HAL (
.h
i.cpp
). Umieść domyślne implementacje whardware/interfaces/configstore/1.0/default
. Na przykład w przypadku:hardware/interfaces/configstore/1.0/default/ChargerConfigs.h
W przypadkustruct 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(); }
Używanie elementów ConfigStore
Aby użyć elementu ConfigStore:
- Dołącz wymagane pliki nagłówkowe. Na przykład w przypadku:
system/core/healthd/healthd.cpp
#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- Uzyskaj dostęp do elementu ConfigStore za pomocą odpowiedniej funkcji szablonu w
android.hardware.configstore-utils
. Na przykład w przypadku:system/core/healthd/healthd.cpp
W tym przykładzie element ConfigStoreusing namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
disableInitBlank
jest pobierany i zapisywany w zmiennej (przydatne, gdy do zmiennej trzeba uzyskać dostęp wiele razy). Wartość pobrana z ConfigStore jest buforowana w instancji funkcji szablonu, dzięki czemu można ją szybko pobrać z buforowanej wartości bez kontaktowania się z usługą ConfigStore w przypadku późniejszych wywołań instancji funkcji szablonu. - Dodaj zależność od ConfigStore i biblioteki
configstore-utils
wAndroid.mk
lubAndroid.bp
. Na przykład w przypadku:system/core/healthd/Android.mk
LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \