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 antarmukaIFoomurni dalam kelas C++; ini berisi metode dan tipe yang didefinisikan dalam antarmukaIFoodi 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 dariIFoodan menjelaskan implementasi antarmuka proxy (sisi klien)HwBinder. Pengembang tidak boleh merujuk ke kelas ini secara langsung. -
BnHwFoo.h. Kelas yang menyimpan referensi ke implementasiIFoodan menjelaskan implementasi rintisanHwBinder(sisi server) dari antarmuka. Pengembang tidak boleh merujuk ke kelas ini secara langsung. -
FooAll.cpp. Kelas yang berisi implementasi untuk proxyHwBinderdan 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
IMyInterfaceyang sepenuhnya memenuhi syarat dalam paket itu adalah:::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterfaceadalah pengidentifikasi, bukan bagian dari namespace). - Jenis yang didefinisikan dalam file
types.halpaket diidentifikasi sebagai:::android::hardware::mypackage::V1_2::MyPackageType