Google is committed to advancing racial equity for Black communities. See how.
Эта страница переведена с помощью Cloud Translation API.
Switch to English

Внедрение Сервиса

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