Google is committed to advancing racial equity for Black communities. See how.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Implementando el Servicio

Para prepararse para la implementación de HAL, puede generar un código de interfaz básico de ConfigStore y luego modificarlo para satisfacer sus necesidades.

Generando código de interfaz

Para generar código repetitivo para la interfaz, ejecute hidl-gen . Por ejemplo, para generar código para 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

Modificar Android.mk

A continuación, modifique el archivo Android.mk para agregar el archivo de implementación ( <modulename>Configs.cpp ) a LOCAL_SRC_FILES y para asignar indicadores de compilación a definiciones de macros. Por ejemplo, puede modificar surfaceflinger en 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

Si Android.mk incluye varios bloques ifeq-endif , considere mover su código a un nuevo archivo (es decir, surfaceflinger.mk ) y luego incluya ese archivo de Android.mk .

Implementando funciones

Para llenar las funciones para implementar el HAL, vuelva a llamar a la función _hidl_cb con diferentes valores (condicionada a _hidl_cb de compilación). Por ejemplo, puede completar las funciones para surfaceflinger en 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
}

Asegúrese de que la implementación no contenga una función denominada HIDL_FETCH_ interface-name (por ejemplo, HIDL_FETCH_ISurfaceFlingerConfigs ). Esta función es necesaria para el modo de paso a través HIDL, que no se utiliza (y prohibido) por configstore . ConfigStore siempre debe ejecutarse en modo enlazado.

Registrarse como servicio

Finalmente, registre todas las implementaciones de la interfaz en el servicio configstore . Por ejemplo, puede registrar implementaciones de surfaceflinger en 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();

Garantizar el acceso temprano

Para garantizar que un módulo de marco pueda obtener acceso anticipado al servicio HAL, el servicio config HAL debe iniciarse lo antes posible, justo después de que hwservicemanager esté listo. Como el servicio config HAL no lee archivos externos, se espera que esté listo rápidamente después de su lanzamiento.