Untuk mempersiapkan implementasi HAL, Anda dapat membuat kode antarmuka ConfigStore dasar, lalu memodifikasinya untuk memenuhi kebutuhan Anda.
Menghasilkan kode antarmuka
Untuk menghasilkan kode boilerplate untuk antarmuka, jalankan hidl-gen
. Misalnya, untuk menghasilkan kode untuk 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
Memodifikasi Android.mk
Selanjutnya, modifikasi file Android.mk
untuk menambahkan file implementasi ( <modulename>Configs.cpp
) ke LOCAL_SRC_FILES
dan untuk memetakan flag build ke dalam definisi makro. Misalnya, Anda dapat memodifikasi surfaceflinger
di 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
Jika Android.mk
menyertakan beberapa blok ifeq-endif
, pertimbangkan untuk memindahkan kode Anda ke file baru (yaitu, surfaceflinger.mk
) lalu sertakan file tersebut dari Android.mk
.
Menerapkan fungsi
Untuk mengisi fungsi untuk mengimplementasikan HAL, panggil kembali fungsi _hidl_cb
dengan nilai yang berbeda (dikondisikan pada flag build). Misalnya, Anda dapat mengisi fungsi untuk surfaceflinger
di 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 }
Pastikan implementasi tidak berisi fungsi bernama HIDL_FETCH_ interface-name
(misalnya, HIDL_FETCH_ISurfaceFlingerConfigs
). Fungsi ini diperlukan untuk mode passthrough HIDL, yang tidak digunakan (dan dilarang) oleh configstore
. ConfigStore harus selalu berjalan dalam mode binder.
Mendaftar sebagai layanan
Terakhir, daftarkan semua implementasi antarmuka ke layanan configstore
. Misalnya, Anda dapat mendaftarkan implementasi surfaceflinger
di 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();
Memastikan akses awal
Untuk memastikan bahwa modul kerangka kerja bisa mendapatkan akses awal layanan HAL, layanan config HAL harus dimulai sedini mungkin, tepat setelah hwservicemanager
siap. Karena layanan config HAL tidak membaca file eksternal, layanan ini diharapkan siap dengan cepat setelah diluncurkan.