Aggiunta di classi ed elementi di ConfigStore

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

È 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 usa l'esempio di un elemento di configurazione disableInitBlank per healthd aggiunto alla classe di interfaccia IChargerConfigs .

Aggiunta di classi di interfaccia

Se non è definita alcuna classe di interfaccia per il metodo di interfaccia che si desidera aggiungere, è necessario aggiungere la classe di interfaccia prima di poter aggiungere gli elementi di ConfigStore associati.

  1. Creare un file di interfaccia HAL. La versione di ConfigStore è 1.0, quindi definisci le interfacce di ConfigStore in hardware/interfaces/configstore/1.0 . Ad esempio, in hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Aggiorna Android.bp e Android.mk per la libreria condivisa di 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
    
    Questi comandi aggiornano Android.bp e Android.mk in hardware/interfaces/configstore/1.0 .
  3. 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 e ChargerConfigs.cpp , in hardware/interfaces/configstore/1.0/default .
  4. Aprire i file di implementazione .h e .cpp e rimuovere il codice relativo alla funzione HIDL_FETCH_ name (ad esempio, HIDL_FETCH_IChargerConfigs ). Questa funzione è necessaria per la modalità passthrough HIDL, che non è usata da ConfigStore.
  5. Registrare l'implementazione al 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
    }
    
  6. Modifica il file Android.mk per aggiungere il file di implementazione ( modulename Configs.cpp ) a LOCAL_SRC_FILES e per mappare i flag di build nelle definizioni delle macro. Ad esempio, in 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
    
  7. (Facoltativo) Aggiungi una voce manifest. Se non esiste, impostare per impostazione predefinita il nome dell'istanza "predefinito" 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>
    
  8. Aggiungi la regola sepolicy se necessario (ovvero, se il client non dispone delle autorizzazioni per effettuare chiamate hwbinder a hal_configstore ). Ad esempio, in system/sepolicy/private/healthd.te :
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Aggiunta di nuovi elementi ConfigStore

Per aggiungere un nuovo elemento ConfigStore:

  1. Aprire il file HAL e aggiungere il metodo di interfaccia richiesto per l'elemento. (I file .hal per ConfigStore risiedono in hardware/interfaces/configstore/1.0 .) Ad esempio, in hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Implementare il metodo nei file di implementazione HAL dell'interfaccia corrispondenti ( .h e .cpp ). Posiziona le implementazioni predefinite in hardware/interfaces/configstore/1.0/default . Ad esempio, in hardware/interfaces/configstore/1.0/default/ChargerConfigs.h :
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    E 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();
    }
    

Utilizzo degli elementi di ConfigStore

Per utilizzare un elemento ConfigStore:

  1. 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>
    
  2. Accedi all'elemento ConfigStore utilizzando la funzione modello appropriata in android.hardware.configstore-utils . Ad esempio, 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 questo esempio, l'elemento disableInitBlank viene recuperato e archiviato in una variabile (utile quando è necessario accedere più volte alla variabile). 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 chiamate successive alla funzione modello istanziata.
  3. Aggiungi la dipendenza da ConfigStore e la libreria configstore-utils in Android.mk o Android.bp . Ad esempio, in system/core/healthd/Android.mk :
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \