Внедрить услугу

Для подготовки к реализации HAL вы можете сгенерировать базовый код интерфейса ConfigStore, а затем модифицировать его в соответствии со своими потребностями.

Сгенерировать код интерфейса

Для генерации шаблонного кода для интерфейса запустите hidl-gen . Например, для генерации кода для 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

Далее, измените файл Android.mk , добавив файл реализации ( <modulename>Configs.cpp ) в LOCAL_SRC_FILES и сопоставив флаги сборки с определениями макросов. Например, вы можете изменить surfaceflinger в 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

Если Android.mk содержит несколько блоков ifeq-endif , рассмотрите возможность переноса вашего кода в новый файл (например, surfaceflinger.mk ), а затем включения этого файла из Android.mk .

Реализация функций

Чтобы заполнить функции для реализации HAL, вызовите функцию _hidl_cb с различными значениями (в зависимости от флагов сборки). Например, вы можете заполнить функции для surfaceflinger в 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
}

Убедитесь, что реализация не содержит функцию с именем HIDL_FETCH_ interface-name (например, HIDL_FETCH_ISurfaceFlingerConfigs ). Эта функция необходима для режима сквозной передачи HIDL, который не используется (и запрещен) configstore . ConfigStore всегда должен работать в режиме связывания.

Зарегистрироваться как сервис

Наконец, зарегистрируйте все реализации интерфейсов в службе configstore . Например, вы можете зарегистрировать реализации surfaceflinger в 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();

Обеспечьте ранний доступ

Чтобы обеспечить ранний доступ модуля фреймворка к службе HAL, служба config HAL должна запускаться как можно раньше, сразу после того, как hwservicemanager будет готов. Поскольку служба config HAL не считывает внешние файлы, ожидается, что она будет готова быстро после запуска.