Triển khai dịch vụ

Để chuẩn bị cho việc triển khai HAL, bạn có thể tạo ConfigStore cơ bản mã giao diện, sau đó sửa đổi mã đó cho phù hợp với nhu cầu của bạn.

Tạo mã giao diện

Để tạo mã nguyên mẫu cho giao diện này, hãy chạy hidl-gen. Ví dụ: để tạo mã cho 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

Sửa đổi Android.mk

Tiếp theo, hãy chỉnh sửa tệp Android.mk để thêm tệp triển khai (<modulename>Configs.cpp) đến LOCAL_SRC_FILES và để ánh xạ cờ bản dựng vào các định nghĩa macro. Ví dụ: bạn có thể sửa đổi surfaceflinger inch 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

Nếu Android.mk bao gồm nhiều khối ifeq-endif, hãy cân nhắc di chuyển mã vào một tệp mới (tức là surfaceflinger.mk) sau đó đưa tệp đó vào Android.mk.

Triển khai hàm

Để điền các hàm nhằm triển khai HAL, hãy gọi lại Hàm _hidl_cb có các giá trị khác nhau (được điều chỉnh dựa trên bản dựng cờ). Ví dụ: bạn có thể điền các hàm cho surfaceflinger inch 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
}

Đảm bảo rằng quá trình triển khai không chứa hàm có tên HIDL_FETCH_interface-name (ví dụ: HIDL_FETCH_ISurfaceFlingerConfigs). Hàm này cần cho Chế độ truyền qua HIDL không được sử dụng (và bị cấm) bởi configstore. ConfigStore phải luôn chạy ở chế độ liên kết.

Đăng ký dưới dạng dịch vụ

Cuối cùng, hãy đăng ký tất cả các triển khai giao diện vào Dịch vụ configstore. Ví dụ: bạn có thể đăng ký surfaceflinger cách triển khai trong 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();

Đảm bảo quyền tiếp cận sớm

Để đảm bảo rằng một mô-đun khung có thể tiếp cận sớm dịch vụ HAL, config dịch vụ HAL nên bắt đầu càng sớm càng tốt, ngay sau hwservicemanager đã sẵn sàng. Vì dịch vụ HAL (Lớp trừu tượng phần cứng) không đọc tệp bên ngoài, dự kiến sẽ nhanh chóng sẵn sàng sau khi được khởi chạy.