Чтобы подготовиться к реализации 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, служба конфигурации HAL должна запускаться как можно раньше, сразу после того, как hwservicemanager
будет готов. Поскольку служба конфигурации HAL не читает внешние файлы, ожидается, что она будет готова быстро после запуска.