Để 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.