Paket

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:

File yang dihasilkan oleh kompiler

Gambar 1. File yang dihasilkan oleh compiler
  • IFoo.h . Menjelaskan antarmuka IFoo murni dalam kelas C++; ini berisi metode dan tipe yang didefinisikan dalam antarmuka IFoo di file IFoo.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 dari IFoo dan menjelaskan implementasi antarmuka proxy (sisi klien) HwBinder . Pengembang tidak boleh merujuk ke kelas ini secara langsung.
  • BnHwFoo.h . Kelas yang menyimpan referensi ke implementasi IFoo dan menjelaskan implementasi rintisan HwBinder (sisi server) dari antarmuka. Pengembang tidak boleh merujuk ke kelas ini secara langsung.
  • FooAll.cpp . Kelas yang berisi implementasi untuk proxy HwBinder dan rintisan HwBinder . 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.

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