È possibile aggiungere nuovi elementi ConfigStore (ovvero metodi di interfaccia) per una classe di interfaccia esistente. Se la classe dell'interfaccia non è definita, è necessario aggiungere una nuova classe prima di poter aggiungere un elemento ConfigStore per quella classe. Questa sezione utilizza l'esempio di un elemento di configurazione disableInitBlank
per healthd
aggiunto alla classe dell'interfaccia IChargerConfigs
.
Aggiunta di classi di interfaccia
Se non è definita alcuna classe di interfaccia per il metodo di interfaccia che desideri aggiungere, devi aggiungere la classe di interfaccia prima di poter aggiungere gli elementi ConfigStore associati.
- Creare un file di interfaccia HAL. La versione di ConfigStore è 1.0, quindi definire le interfacce ConfigStore in
hardware/interfaces/configstore/1.0
. Ad esempio, inhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- Aggiorna
Android.bp
eAndroid.mk
per la libreria condivisa ConfigStore e i file di intestazione per includere la nuova interfaccia HAL. Ad esempio: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
eAndroid.mk
inhardware/interfaces/configstore/1.0
. - Genera lo stub C++ per implementare il codice del server. Ad esempio:
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
Questo comando crea due file,ChargerConfigs.h
eChargerConfigs.cpp
, inhardware/interfaces/configstore/1.0/default
. - Apri i file di implementazione
.h
e.cpp
e rimuovi il codice relativo alHIDL_FETCH_ name
della funzione (ad esempio,HIDL_FETCH_IChargerConfigs
). Questa funzione è necessaria per la modalità passthrough HIDL, che non viene utilizzata da ConfigStore. - Registrare l'implementazione nel servizio ConfigStore. Ad esempio, 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 }
- Modifica il file
Android.mk
per aggiungere il file di implementazione (modulename Configs.cpp
) aLOCAL_SRC_FILES
e per mappare i flag di build nelle definizioni delle macro. Ad esempio, 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
- (Facoltativo) Aggiungi una voce manifest. Se non esiste, utilizza per impostazione predefinita il nome dell'istanza "predefinita" di ConfigStore. Ad esempio, in
device/google/marlin/manifest.xml
:<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- Aggiungi la regola sepolicy se necessario (ovvero, se il client non dispone delle autorizzazioni per effettuare chiamate hwbinder a
hal_configstore
). Ad esempio, insystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Aggiunta di nuovi elementi del ConfigStore
Per aggiungere un nuovo elemento del ConfigStore:
- Apri il file HAL e aggiungi il metodo di interfaccia richiesto per l'elemento. (I file
.hal
per ConfigStore risiedono inhardware/interfaces/configstore/1.0
.) Ad esempio, inhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- Implementare il metodo nei file di implementazione HAL dell'interfaccia corrispondente (
.h
e.cpp
). Posiziona le implementazioni predefinite inhardware/interfaces/configstore/1.0/default
. Ad esempio, inhardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
E 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(); }
Utilizzo degli elementi di ConfigStore
Per utilizzare un elemento ConfigStore:
- Includere i file di intestazione richiesti. Ad esempio, in
system/core/healthd/healthd.cpp
:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- Accedi all'elemento ConfigStore utilizzando la funzione modello appropriata in
android.hardware.configstore-utils
. Ad esempio, 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 questo esempio, l'elemento ConfigStoredisableInitBlank
viene recuperato e archiviato in una variabile (utile quando è necessario accedere alla variabile più volte). Il valore recuperato da ConfigStore viene memorizzato nella cache all'interno della funzione modello istanziata in modo che possa essere recuperato rapidamente dal valore memorizzato nella cache senza contattare il servizio ConfigStore per le chiamate successive alla funzione modello istanziata. - Aggiungi la dipendenza da ConfigStore e la libreria
configstore-utils
inAndroid.mk
oAndroid.bp
. Ad esempio, insystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \