Dengan sedikit pengecualian, paket antarmuka HIDL terletak di hardware/interfaces
atau direktori vendor/
. hardware/interfaces
tingkat atas dipetakan langsung ke namespace paket android.hardware
; versinya adalah subdirektori di bawah namespace paket (bukan antarmuka).
Kompiler hidl-gen
mengkompilasi file .hal
menjadi satu set file .h
dan .cpp
. Dari file yang dibuat secara otomatis ini, perpustakaan bersama yang ditautkan dengan implementasi klien/server akan dibangun. File Android.bp
yang membangun 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 sudah ada, Anda harus menjalankan ulang skrip untuk memastikan pustaka bersama yang dihasilkan adalah yang terbaru.
Misalnya, file contoh IFoo.hal
harus ditempatkan di hardware/interfaces/samples/1.0
. Contoh file 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 tersebut (misalnya, android.hardware.samples@1.0
). Pustaka bersama juga mengekspor satu header, IFoo.h
, yang dapat disertakan oleh klien dan server. Menggunakan kompiler hidl-gen
dengan file antarmuka IFoo.hal
sebagai input, mode pengikat memiliki file yang dibuat secara otomatis berikut:
-
IFoo.h
Menjelaskan antarmukaIFoo
murni di kelas C++; itu berisi metode dan tipe yang ditentukan dalam antarmukaIFoo
di fileIFoo.hal
, diterjemahkan ke tipe C++ jika diperlukan. Tidak memuat detail terkait mekanisme RPC (misalnyaHwBinder
) yang digunakan untuk mengimplementasikan antarmuka ini. Kelas diberi namespace dengan paket dan versinya, misalnya::android::hardware::samples::IFoo::V1_0
. Baik klien maupun server menyertakan header ini: Klien untuk memanggil metode di dalamnya dan server untuk mengimplementasikan metode tersebut. -
IHwFoo.h
. File header yang berisi deklarasi fungsi yang membuat serial tipe data yang digunakan dalam antarmuka. Pengembang tidak boleh menyertakan header-nya secara langsung (tidak berisi kelas apa pun). -
BpHwFoo.h
. Kelas yang mewarisi dariIFoo
dan menjelaskan implementasi antarmuka proksiHwBinder
(sisi klien). Pengembang tidak boleh merujuk ke kelas ini secara langsung. -
BnHwFoo.h
. Kelas yang menyimpan referensi ke implementasiIFoo
dan menjelaskan implementasi antarmuka rintisanHwBinder
(sisi server). Pengembang tidak boleh merujuk ke kelas ini secara langsung. -
FooAll.cpp
. Kelas yang berisi implementasi untuk proksiHwBinder
dan rintisanHwBinder
. Ketika klien memanggil metode antarmuka, proksi secara otomatis menyusun argumen dari klien dan mengirimkan transaksi ke driver kernel pengikat, yang mengirimkan transaksi ke stub di sisi lain (yang kemudian memanggil implementasi server sebenarnya).
File-file tersebut memiliki struktur yang mirip dengan file yang dihasilkan oleh aidl-cpp
(untuk detailnya, lihat "Mode passthrough" di Ikhtisar HIDL ). Satu-satunya file yang dibuat secara 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 merujuk langsung ke apa pun selain IFoo
. Untuk mencapai hal 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 suatu paket harus menyertakan perpustakaan 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", ],
Pustaka tambahan yang mungkin perlu Anda sertakan:
libhidlbase | Termasuk tipe data HIDL standar. Mulai 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 perpustakaan ini. |
libhwbinder | Simbol khusus pengikat. Android 10 tidak lagi menggunakan perpustakaan ini. |
libfmq | IPC Antrian Pesan Cepat. |
Ruang nama
Fungsi dan tipe HIDL seperti Return<T>
dan Void()
dideklarasikan dalam namespace ::android::hardware
. Namespace C++ suatu paket ditentukan oleh nama paket dan versinya. Misalnya, paket mypackage dengan versi 1.2 di bawah hardware/interfaces
memiliki kualitas berikut:
- Namespace 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). - Tipe yang didefinisikan dalam file
types.hal
paket diidentifikasi sebagai:::android::hardware::mypackage::V1_2::MyPackageType