Mengimplementasikan layanan

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.