Dengan beberapa pengecualian, paket antarmuka HIDL terletak di
direktori hardware/interfaces
atau vendor/
. Level
atas hardware/interfaces
dipetakan langsung ke
namespace paket android.hardware
; versinya adalah subdirektori
di bawah namespace paket (bukan antarmuka).
Compiler hidl-gen
mengompilasi file .hal
menjadi
serangkaian file .h
dan .cpp
. Dari file yang dihasilkan secara otomatis
ini, library bersama yang ditautkan oleh implementasi klien/server akan di-build.
File Android.bp
yang mem-build library bersama ini
dibuat secara otomatis oleh skrip
hardware/interfaces/update-makefiles.sh
. Setiap kali Anda menambahkan paket baru ke hardware/interfaces
, atau
menambahkan/menghapus file .hal
ke/dari paket yang ada, Anda harus menjalankan ulang
skrip untuk memastikan library bersama yang dihasilkan sudah yang terbaru.
Misalnya, file contoh IFoo.hal
harus berada di
hardware/interfaces/samples/1.0
. File
IFoo.hal
contoh membuat antarmuka IFoo dalam
paket samples:
package android.hardware.samples@1.0; interface IFoo { struct Foo { int64_t someValue; handle myHandle; }; someMethod() generates (vec<uint32_t>); anotherMethod(Foo foo) generates (int32_t ret); };
File yang dibuat
File yang dibuat otomatis dalam paket HIDL ditautkan ke dalam satu library bersama
dengan nama yang sama dengan paket (misalnya,
android.hardware.samples@1.0
). Library bersama juga mengekspor
satu header, IFoo.h
, yang dapat disertakan oleh klien dan
server. Dengan menggunakan compiler hidl-gen
dengan file antarmuka
IFoo.hal
sebagai input, mode binderized memiliki file
yang dibuat secara otomatis berikut:
Gambar 1. File yang dihasilkan oleh compiler.
IFoo.h
. Menjelaskan antarmukaIFoo
murni dalam class C++; berisi metode dan jenis yang ditentukan dalam antarmukaIFoo
dalam fileIFoo.hal
, yang diterjemahkan ke jenis C++ jika diperlukan. Tidak berisi detail yang terkait dengan mekanisme RPC (misalnya,HwBinder
) yang digunakan untuk menerapkan antarmuka ini. Class diberi namespace dengan paket dan versi, misalnya,::android::hardware::samples::IFoo::V1_0
. Klien dan server menyertakan header ini: Klien untuk memanggil metode di dalamnya dan server untuk menerapkan metode tersebut.IHwFoo.h
. File header yang berisi deklarasi untuk fungsi yang melakukan serialisasi jenis data yang digunakan di antarmuka. Developer tidak boleh menyertakan header secara langsung (header tidak berisi class apa pun).BpHwFoo.h
. Class yang mewarisi dariIFoo
dan menjelaskan implementasi proxyHwBinder
(sisi klien) antarmuka. Developer tidak boleh merujuk ke class ini secara langsung.BnHwFoo.h
. Class yang menyimpan referensi ke implementasiIFoo
dan menjelaskan implementasi stubHwBinder
(sisi server) dari antarmuka. Developer tidak boleh merujuk ke class ini secara langsung.FooAll.cpp
. Class yang berisi implementasi untuk proxyHwBinder
dan stubHwBinder
. Saat klien memanggil metode antarmuka, proxy akan otomatis mengatur argumen dari klien dan mengirim transaksi ke driver kernel binder, yang mengirimkan transaksi ke stub di sisi lain (yang kemudian memanggil implementasi server yang sebenarnya).
File disusun dengan cara yang mirip dengan file yang dihasilkan oleh
aidl-cpp
(untuk mengetahui detailnya, lihat "Mode passthrough" di
Ringkasan HIDL). Satu-satunya
file yang dibuat otomatis dan tidak bergantung pada mekanisme RPC yang digunakan oleh HIDL adalah
IFoo.h
; semua file lainnya terikat dengan mekanisme RPC HwBinder yang digunakan
oleh HIDL. Oleh karena itu, implementasi klien dan server tidak boleh
langsung merujuk ke apa pun selain IFoo
. Untuk mencapai
hal ini, hanya sertakan IFoo.h
dan tautkan ke library bersama
yang dihasilkan.
Menautkan ke library bersama
Klien atau server yang menggunakan antarmuka apa pun dalam paket harus menyertakan library bersama paket tersebut di satu (1) lokasi berikut:
- Di Android.mk:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- Di Android.bp:
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
Library tambahan yang mungkin perlu Anda sertakan:
libhidlbase |
Mencakup jenis data HIDL standar. Mulai Android
10, ini juga berisi semua simbol yang sebelumnya ada di
libhidltransport dan
libhwbinder .
|
---|---|
libhidltransport |
Menangani transpor panggilan HIDL melalui mekanisme RPC/IPC yang berbeda. Android 10 tidak lagi menggunakan library ini. |
libhwbinder |
Simbol khusus binder. Android 10 tidak lagi menggunakan library ini. |
libfmq |
IPC Antrean Pesan Cepat. |
Namespace
Fungsi dan jenis HIDL seperti Return<T>
dan
Void()
dideklarasikan dalam namespace ::android::hardware
.
Namespace C++ paket ditentukan oleh nama dan versi paket.
Misalnya, paket mypackage dengan versi 1.2 di
hardware/interfaces
memiliki kualitas berikut:
- Namespace C++ adalah
::android::hardware::mypackage::V1_2
- Nama yang sepenuhnya memenuhi syarat dari
IMyInterface
dalam paket tersebut adalah:::android::hardware::mypackage::V1_2::IMyInterface
. (IMyInterface
adalah ID, bukan bagian dari namespace). - Jenis yang ditentukan dalam file
types.hal
paket diidentifikasi sebagai:::android::hardware::mypackage::V1_2::MyPackageType