Paket

Dengan beberapa pengecualian, paket antarmuka HIDL terletak di direktori hardware/interfaces atau vendor/. Level atas hardware/interfaces dipetakan langsung ke namespace paket android.hardware; versinya adalah subdirektori di bawah namespace paket (bukan antarmuka).

Compiler hidl-gen mengompilasi file .hal menjadi serangkaian file .h dan .cpp. Dari file yang dihasilkan secara otomatis ini, library bersama yang ditautkan oleh implementasi klien/server akan di-build. File Android.bp yang mem-build library 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 ulang skrip untuk memastikan library bersama yang dihasilkan sudah yang terbaru.

Misalnya, file contoh IFoo.hal harus berada di hardware/interfaces/samples/1.0. File IFoo.hal contoh membuat antarmuka IFoo dalam paket samples:

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 dibuat

File yang dibuat otomatis dalam paket HIDL ditautkan ke dalam satu library bersama dengan nama yang sama dengan paket (misalnya, android.hardware.samples@1.0). Library bersama juga mengekspor satu header, IFoo.h, yang dapat disertakan oleh klien dan server. Dengan menggunakan compiler hidl-gen dengan file antarmuka IFoo.hal sebagai input, mode binderized memiliki file yang dibuat secara otomatis berikut:

File
yang dihasilkan oleh compiler

Gambar 1. File yang dihasilkan oleh compiler.

  • IFoo.h. Menjelaskan antarmuka IFoo murni dalam class C++; berisi metode dan jenis yang ditentukan dalam antarmuka IFoo dalam file IFoo.hal, yang diterjemahkan ke jenis C++ jika diperlukan. Tidak berisi detail yang terkait dengan mekanisme RPC (misalnya, HwBinder) yang digunakan untuk menerapkan antarmuka ini. Class diberi namespace dengan paket dan versi, misalnya, ::android::hardware::samples::IFoo::V1_0. 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 melakukan serialisasi jenis data yang digunakan di antarmuka. Developer tidak boleh menyertakan header secara langsung (header tidak berisi class apa pun).
  • BpHwFoo.h. Class yang mewarisi dari IFoo dan menjelaskan implementasi proxy HwBinder (sisi klien) antarmuka. Developer tidak boleh merujuk ke class ini secara langsung.
  • BnHwFoo.h. Class yang menyimpan referensi ke implementasi IFoo dan menjelaskan implementasi stub HwBinder (sisi server) dari antarmuka. Developer tidak boleh merujuk ke class ini secara langsung.
  • FooAll.cpp. Class yang berisi implementasi untuk proxy HwBinder dan stub HwBinder. Saat klien memanggil metode antarmuka, proxy akan otomatis mengatur argumen dari klien dan mengirim transaksi ke driver kernel binder, yang mengirimkan transaksi ke stub di sisi lain (yang kemudian memanggil implementasi server yang sebenarnya).

File disusun dengan cara yang mirip dengan file yang dihasilkan oleh aidl-cpp (untuk mengetahui detailnya, lihat "Mode passthrough" di Ringkasan HIDL). Satu-satunya file yang dibuat 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 langsung merujuk ke apa pun selain IFoo. Untuk mencapai hal ini, hanya sertakan IFoo.h dan tautkan ke library bersama yang dihasilkan.

Klien atau server yang menggunakan antarmuka apa pun dalam paket harus menyertakan library 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",
    ],

Library tambahan yang mungkin perlu Anda sertakan:

libhidlbase Mencakup jenis data HIDL standar. Mulai Android 10, ini juga berisi semua simbol yang sebelumnya ada di libhidltransport dan libhwbinder.
libhidltransport Menangani transpor panggilan HIDL melalui mekanisme RPC/IPC yang berbeda. Android 10 tidak lagi menggunakan library ini.
libhwbinder Simbol khusus binder. Android 10 tidak lagi menggunakan library ini.
libfmq IPC Antrean Pesan Cepat.

Namespace

Fungsi dan jenis HIDL seperti Return<T> dan Void() dideklarasikan dalam namespace ::android::hardware. Namespace C++ paket ditentukan oleh nama dan versi paket. Misalnya, paket mypackage dengan versi 1.2 di hardware/interfaces memiliki kualitas berikut:

  • Namespace C++ adalah ::android::hardware::mypackage::V1_2
  • Nama yang sepenuhnya memenuhi syarat dari IMyInterface dalam paket tersebut adalah: ::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterface adalah ID, bukan bagian dari namespace).
  • Jenis yang ditentukan dalam file types.hal paket diidentifikasi sebagai: ::android::hardware::mypackage::V1_2::MyPackageType