Możesz dodać nowe elementy ConfigStore (czyli metody interfejsu) dla
istniejącej klasy interfejsu. Jeśli klasa interfejsu nie jest zdefiniowana, musisz dodać
zanim będzie można dodać do niej element ConfigStore. Ta sekcja
korzysta z przykładu elementu konfiguracji disableInitBlank
dla
healthd
jest dodawany do interfejsu IChargerConfigs
zajęcia.
Dodaj klasy interfejsu
Jeśli nie zdefiniowano klasy interfejsu dla wybranej metody interfejsu add, musisz dodać klasę interfejsu, zanim będzie można dodać powiązaną Elementy ConfigStore.
- Utwórz plik interfejsu HAL. ConfigStore w wersji 1.0, zdefiniuj
Interfejsy ConfigStore w
hardware/interfaces/configstore/1.0
. Dla: 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
dla Udostępniana biblioteka i pliki nagłówka ConfigStore, aby uwzględnić nowy interfejs HAL. Na przykład: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 atrapę C++ do implementacji kodu serwera. Na przykład:
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
To polecenie tworzy 2 pliki:ChargerConfigs.h
orazChargerConfigs.cpp
w:hardware/interfaces/configstore/1.0/default
- Otwórz pliki implementacji
.h
oraz.cpp
i usuń kod związany z funkcjąHIDL_FETCH_name
(dla np.HIDL_FETCH_IChargerConfigs
). Ta funkcja jest potrzebna do Tryb przekazywania HIDL, który nie jest używany przez ConfigStore. - Zarejestruj implementację w usłudze ConfigStore. Na przykład w polu
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
) do:LOCAL_SRC_FILES
oraz mapować flagi kompilacji na definicje makr. Na przykład w poluhardware/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 manifestu. Jeśli nie istnieje, użyj domyślnego ustawienia
„domyślnie” nazwę instancji ConfigStore. Na przykład w polu
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 (tzn. jeśli klient nie ma
uprawnienia do tworzenia wywołań funkcji hwbinder dla interfejsu
hal_configstore
). Dla: przykład wsystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Dodaj nowe elementy ConfigStore
Aby dodać nowy element ConfigStore:
- Otwórz plik HAL i dodaj wymaganą metodę interfejsu dla elementu. (Parametr
.hal
plików ConfigStore znajduje się whardware/interfaces/configstore/1.0
). Na przykład w sekcjihardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- Zaimplementuj tę metodę w odpowiednich plikach implementacji HAL interfejsu
(
.h
i.cpp
). Umieść implementacje domyślne whardware/interfaces/configstore/1.0/default
Na przykład w poluhardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
Oraz w: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łówka. Na przykład w polu
system/core/healthd/healthd.cpp
:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- Uzyskaj dostęp do elementu ConfigStore, używając odpowiedniej funkcji szablonu w
android.hardware.configstore-utils
Na przykład w polusystem/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);
W tym przykładzie pobierany jest elementdisableInitBlank
w magazynie konfiguracji. i zapisane w zmiennej (przydatne, gdy do zmiennej trzeba uzyskać dostęp wiele razy razy). Wartość pobrana z ConfigStore jest przechowywana w pamięci podręcznej została utworzona w instancji funkcji szablonu, tak aby można było szybko pobrać ją z z pamięci podręcznej bez kontaktowania się z usługą ConfigStore w celu późniejszego wywołania funkcji utworzonej przez nas funkcji szablonu. - Dodaj zależność od ConfigStore i
configstore-utils
biblioteka w usłudzeAndroid.mk
lubAndroid.bp
. Na przykład w polusystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \