Dienst implementieren

<ph type="x-smartling-placeholder">

Zur Vorbereitung auf die HAL-Implementierung können Sie einen grundlegenden ConfigStore generieren. und dann an Ihre Anforderungen anpassen.

Schnittstellencode generieren

Führen Sie hidl-gen aus, um Boilerplate-Code für die Schnittstelle zu generieren. So generieren Sie beispielsweise Code für surfaceflinger:

hidl-gen -o hardware/interfaces/configstore/1.0/default \
    -Lc++-impl \
    -randroid.hardware:hardware/interfaces \
    -randroid.hidl:system/libhidl/transport \
    android.hardware.config@1.0::ISurfaceFlingerConfigs

Android.mk modifizieren

Als Nächstes ändern Sie die Datei Android.mk, um die Implementierungsdatei hinzuzufügen (<modulename>Configs.cpp) nach LOCAL_SRC_FILES und um Build-Flags in Makrodefinitionen einzubinden. Sie können beispielsweise surfaceflinger Zoll hardware/interface/configstore/1.0/default/Android.mk:

LOCAL_SRC_FILES += SurfaceFlingerConfigs.cpp
ifneq ($(NUM_FRAMEBUFFER_SURFACE_BUFFERS),)
    LOCAL_CFLAGS += -DNUM_FRAMEBUFFER_SURFACE_BUFFERS=$(NUM_FRAMEBUFFER_SURFACE_BUFFERS)
endif

ifeq ($(TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK),true)
    LOCAL_CFLAGS += -DRUNNING_WITHOUT_SYNC_FRAMEWORK
endif

Wenn Android.mk mehrere ifeq-endif-Blöcke umfasst, verschieben Sie Ihren Code in eine neue Datei (d. h. surfaceflinger.mk) und schließen Sie dann diese Datei aus Android.mk

Funktionen implementieren

Rufen Sie zum Füllen der Funktionen zum Implementieren des HAL den _hidl_cb-Funktion mit unterschiedlichen Werten (abhängig vom Build) Flags). Sie können beispielsweise die Funktionen für surfaceflinger ausfüllen. in hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp:

Return<void> SurfaceFlingerConfigs::numFramebufferSurfaceBuffers(
        numFramebufferSurfaceBuffers_cb _hidl_cb) {
    #if NUM_FRAMEBUFFER_SURFACE_BUFFERS 2
    _hidl_cb(NumBuffers.TWO);
    #else if NUM_FRAMEBUFFER_SURFACE_BUFFERS 3
    _hidl_cb(NumBuffers.THREE);
    #else
    _hidl_cb(NumBuffers.USE_DEFAULT);
    #endif
}

Return<void> SurfaceFlingerConfigs::runWithoutSyncFramework(
        runWithoutSyncFramework_cb _hidl_cb) {
    #ifdef RUNNING_WITHOUT_SYNC_FRAMEWORK
    _hidl_cb({true /* specified */, true /* value */});
    #else
    // when macro not defined, we can give any value to the second argument.
    // It will simply be ignored in the framework side.
    _hidl_cb({false /* specified */, false /* value */});
    #endif
}

Achten Sie darauf, dass die Implementierung keine Funktion namens HIDL_FETCH_interface-name (z. B. HIDL_FETCH_ISurfaceFlingerConfigs). Diese Funktion wird benötigt für HIDL-Passthrough-Modus, der durch configstore ConfigStore muss immer im Binder-Modus ausgeführt werden.

Als Dienst registrieren

Registrieren Sie abschließend alle Schnittstellenimplementierungen im configstore-Dienst. Sie können sich zum Beispiel surfaceflinger Implementierungen in hardware/interfaces/configstore/1.0/default/service.cpp:

configureRpcThreadpool(maxThreads, true);
sp<ISurfaceFlingerConfigs> surfaceFlingerConfigs = new SurfaceFlingerConfigs;
status_t status = surfaceFlingerConfigs->registerAsService();

sp<IBluetoothConfigs> bluetoothConfigs = new BluetoothConfigs;
status = bluetoothConfigs->registerAsService();

// register more interfaces here
joinRpcThreadpool();

Vorabzugriff sichern

Damit ein Framework-Modul Vorabzugriff auf den HAL-Dienst erhalten kann, muss der Parameter Config HAL-Dienst sollte so früh wie möglich gestartet werden, kurz nach hwservicemanager ist bereit. Da der Konfigurations-HAL-Dienst die externen Dateien bereitgestellt werden, dürfen sie schnell nach dem Start verfügbar sein.