Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Menerapkan Layanan

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, menjalankan 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

Berikutnya, memodifikasi Android.mk file untuk menambahkan file implementasi ( <modulename>Configs.cpp ) untuk LOCAL_SRC_FILES dan untuk memetakan membangun bendera 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 meliputi beberapa ifeq-endif blok, pertimbangkan untuk memindahkan kode Anda ke dalam sebuah file baru (yaitu, surfaceflinger.mk ) maka menyertakan file dari Android.mk .

Menerapkan fungsi

Untuk mengisi fungsi untuk melaksanakan HAL, memanggil kembali _hidl_cb fungsi dengan nilai yang berbeda (AC pada membangun bendera). 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 bahwa pelaksanaan tidak mengandung fungsi bernama HIDL_FETCH_ interface-name (misalnya, HIDL_FETCH_ISurfaceFlingerConfigs ). Fungsi ini diperlukan untuk HIDL modus passthrough, yang tidak terpakai (dan dilarang) oleh configstore . ConfigStore harus selalu berjalan dalam mode binder.

Mendaftar sebagai layanan

Akhirnya, daftar semua implementasi antarmuka untuk configstore layanan. Misalnya, Anda dapat mendaftarkan surfaceflinger implementasi 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 bisa mendapatkan akses awal layanan HAL, layanan konfigurasi HAL harus dimulai sedini mungkin, hanya setelah hwservicemanager siap. Karena layanan config HAL tidak membaca file eksternal, layanan ini diharapkan siap dengan cepat setelah diluncurkan.