Untuk mempersiapkan implementasi HAL, Anda dapat membuat ConfigStore dasar kode antarmuka Anda, lalu modifikasi sesuai kebutuhan Anda.
Membuat kode antarmuka
Untuk membuat kode boilerplate untuk antarmuka, jalankan hidl-gen
.
Misalnya, guna membuat 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
Mengubah Android.mk
Selanjutnya, ubah file Android.mk
untuk menambahkan file implementasi
(<modulename>Configs.cpp
) ke LOCAL_SRC_FILES
dan
untuk memetakan tanda build ke dalam definisi makro. Misalnya, Anda dapat memodifikasi
surfaceflinger
inci
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
.
Mengimplementasikan fungsi
Untuk mengisi fungsi guna menerapkan HAL, panggil kembali metode
Fungsi _hidl_cb
dengan nilai yang berbeda (dikondisikan pada build
penanda). Misalnya, Anda dapat mengisi fungsi untuk surfaceflinger
inci
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 binderized.
Daftar sebagai layanan
Terakhir, daftarkan semua implementasi antarmuka ke
Layanan configstore
. Misalnya, Anda dapat mendaftar
surfaceflinger
penerapan 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();
Pastikan akses awal
Untuk memastikan bahwa modul kerangka kerja bisa
mendapatkan akses awal ke layanan HAL,
layanan HAL konfigurasi harus dimulai sedini mungkin, tepat setelah
hwservicemanager
sudah siap. Karena layanan HAL konfigurasi
tidak membaca
file eksternal, file tersebut diharapkan siap
dalam waktu singkat setelah diluncurkan.