Puoi aggiungere nuovi elementi ConfigStore (ovvero metodi di interfaccia) per una classe di interfaccia esistente. Se la classe di interfaccia non è definita, devi 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
da aggiungere alla classe di interfaccia
IChargerConfigs
.
Aggiungere classi di interfaccia
Se non è definita una classe di interfaccia per il metodo di interfaccia che vuoi aggiungere, devi aggiungere la classe di interfaccia prima di poter aggiungere gli elementi ConfigStore associati.
- Crea un file di interfaccia HAL. La versione di ConfigStore è 1.0, quindi definisci 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 e i file di intestazione ConfigStore in modo da includere la nuova interfaccia HAL. Ad esempio: Questi comandi aggiornanohidl-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 l'implementazione del codice del server. Ad esempio:
Questo comando crea due file,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
eChargerConfigs.cpp
, inhardware/interfaces/configstore/1.0/default
. - Apri i file di implementazione
.h
e.cpp
e rimuovi il codice relativo alla funzioneHIDL_FETCH_name
(ad es.HIDL_FETCH_IChargerConfigs
). Questa funzione è necessaria per la modalità di passaggio HIDL, che non viene utilizzata da ConfigStore. - Registra 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 (modulenameConfigs.cpp
) aLOCAL_SRC_FILES
e per mappare i flag di compilazione alle definizioni di 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, viene utilizzato 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 ha le autorizzazioni per effettuare chiamate hwbinder a
hal_configstore
). Ad esempio, insystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Aggiungere nuovi elementi ConfigStore
Per aggiungere un nuovo elemento ConfigStore:
- Apri il file HAL e aggiungi il metodo di interfaccia richiesto per l'elemento. I file
.hal
per ConfigStore si trovano 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); };
- Implementa 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
: E instruct 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(); }
Utilizzare gli elementi ConfigStore
Per utilizzare un elemento ConfigStore:
- Includi 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 del modello appropriata in
android.hardware.configstore-utils
. Ad esempio, insystem/core/healthd/healthd.cpp
: In questo esempio, l'elemento ConfigStoreusing namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
disableInitBlank
viene recuperato e memorizzato in una variabile (utile quando è necessario accedere alla variabile più volte). Il valore recuperato da ConfigStore viene memorizzato nella cache all'interno della funzione del modello creata in modo da poter essere recuperato rapidamente dal valore memorizzato nella cache senza contattare il servizio ConfigStore per le chiamate successive alla funzione del modello creata. - Aggiungi la dipendenza da ConfigStore e dalla 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) \