Dengan beberapa pengecualian, paket antarmuka HIDL terletak di hardware/interfaces
atau direktori vendor/
. Perangkat hardware/interfaces
memetakan langsung ke namespace paket android.hardware
; versi adalah subdirektori di bawah namespace paket (bukan antarmuka).
hidl-gen
mengkompilasi file .hal
menjadi satu set file .h
dan .cpp
. Dari file yang dibuat secara otomatis ini, perpustakaan bersama yang ditautkan ke implementasi klien/server dibangun. File Android.bp
yang membuat pustaka 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 kembali skrip untuk memastikan pustaka bersama yang dihasilkan mutakhir.
Misalnya, file sampel IFoo.hal
harus ditempatkan di hardware/interfaces/samples/1.0
. File sampel IFoo.hal
membuat antarmuka IFoo dalam paket sampel :
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 dihasilkan
File yang dibuat secara otomatis dalam paket HIDL ditautkan ke satu pustaka bersama dengan nama yang sama dengan paket (misalnya, android.hardware.samples@1.0
). Pustaka bersama juga mengekspor satu header, IFoo.h
, yang dapat disertakan oleh klien dan server. Menggunakan compiler hidl-gen
dengan file antarmuka IFoo.hal
sebagai input, mode binderized memiliki file autogenerated berikut:
-
IFoo.h
. Menjelaskan antarmukaIFoo
murni dalam kelas C++; ini berisi metode dan tipe yang didefinisikan dalam antarmukaIFoo
di fileIFoo.hal
, diterjemahkan ke tipe C++ jika diperlukan. Tidak berisi detail yang terkait dengan mekanisme RPC (misalnya,HwBinder
) yang digunakan untuk mengimplementasikan antarmuka ini. Kelas diberi namespace dengan paket dan versinya, misalnya::android::hardware::samples::IFoo::V1_0
. Baik 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 membuat serial tipe data yang digunakan dalam antarmuka. Pengembang tidak boleh memasukkan tajuknya secara langsung (tidak mengandung kelas apa pun). -
BpHwFoo.h
. Kelas yang mewarisi dariIFoo
dan menjelaskan implementasi antarmuka proxy (sisi klien)HwBinder
. Pengembang tidak boleh merujuk ke kelas ini secara langsung. -
BnHwFoo.h
. Kelas yang menyimpan referensi ke implementasiIFoo
dan menjelaskan implementasi rintisanHwBinder
(sisi server) dari antarmuka. Pengembang tidak boleh merujuk ke kelas ini secara langsung. -
FooAll.cpp
. Kelas yang berisi implementasi untuk proxyHwBinder
dan rintisanHwBinder
. Ketika klien memanggil metode antarmuka, proxy secara otomatis menyusun argumen dari klien dan mengirimkan transaksi ke driver kernel pengikat, yang mengirimkan transaksi ke rintisan di sisi lain (yang kemudian memanggil implementasi server yang sebenarnya).
File terstruktur mirip dengan file yang dihasilkan oleh aidl-cpp
(untuk detailnya, lihat "Mode passthrough" di Ikhtisar HIDL ). Satu-satunya file autogenerated yang independen dari mekanisme RPC yang digunakan oleh HIDL adalah IFoo.h
; semua file lain terkait dengan mekanisme RPC HwBinder yang digunakan oleh HIDL. Oleh karena itu, implementasi klien dan server tidak boleh secara langsung merujuk ke apa pun selain IFoo
. Untuk mencapai ini, sertakan hanya IFoo.h
dan tautkan ke perpustakaan bersama yang dihasilkan.
Menautkan ke perpustakaan bersama
Klien atau server yang menggunakan antarmuka apa pun dalam sebuah paket harus menyertakan pustaka bersama dari paket tersebut di salah 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", ],
Pustaka tambahan yang mungkin perlu Anda sertakan:
libhidlbase | Termasuk tipe data HIDL standar. Mulai di Android 10, ini juga berisi semua simbol yang sebelumnya ada di libhidltransport dan libhwbinder . |
---|---|
libhidltransport | Menangani pengangkutan panggilan HIDL melalui mekanisme RPC/IPC yang berbeda. Android 10 tidak lagi menggunakan library ini. |
libhwbinder | Simbol khusus pengikat. Android 10 tidak lagi menggunakan library ini. |
libfmq | Antrian Pesan Cepat IPC. |
Ruang nama
Fungsi dan tipe HIDL seperti Return<T>
dan Void()
dideklarasikan di namespace ::android::hardware
. Namespace C++ dari sebuah paket ditentukan oleh nama paket dan versinya. Misalnya, paket mypackage dengan versi 1.2 di bawah hardware/interfaces
memiliki kualitas berikut:
- Ruang nama C++ adalah
::android::hardware::mypackage::V1_2
- Nama
IMyInterface
yang sepenuhnya memenuhi syarat dalam paket itu adalah:::android::hardware::mypackage::V1_2::IMyInterface
. (IMyInterface
adalah pengidentifikasi, bukan bagian dari namespace). - Jenis yang didefinisikan dalam file
types.hal
paket diidentifikasi sebagai:::android::hardware::mypackage::V1_2::MyPackageType