Paket

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:

File yang dihasilkan oleh kompiler

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

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