Paket

Dengan beberapa pengecualian, paket antarmuka HIDL berada di hardware/interfaces atau direktori vendor/. Tujuan hardware/interfaces peta tingkat teratas langsung ke Namespace paket android.hardware; versinya adalah subdirektori pada namespace paket (bukan antarmuka).

Compiler hidl-gen mengompilasi file .hal menjadi kumpulan file .h dan .cpp. Dari sini dibuat secara otomatis {i>shared library<i} yang menjadi tujuan penautan implementasi klien/server. File Android.bp yang membangun library bersama ini dibuat secara otomatis oleh hardware/interfaces/update-makefiles.sh {i>script<i}. Setiap kali Anda menambahkan paket baru ke hardware/interfaces, atau menambah/menghapus .hal file ke/dari paket yang ada, Anda harus menjalankan kembali skrip untuk memastikan bahwa pustaka bersama yang dihasilkan adalah yang terbaru.

Misalnya, file contoh IFoo.hal harus berada di hardware/interfaces/samples/1.0. Contoh File IFoo.hal membuat antarmuka IFoo di 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 menjadi satu file bersama library dengan nama yang sama dengan paket (misalnya, android.hardware.samples@1.0). Pustaka bersama juga mengekspor {i>header<i} tunggal, IFoo.h, yang dapat disertakan oleh klien dan server web. Menggunakan compiler hidl-gen dengan IFoo.hal sebagai input, mode binderized (mode binderized) memiliki fungsi file:

File
dihasilkan oleh compiler

Gambar 1. File yang dihasilkan oleh compiler.

  • IFoo.h. Menjelaskan IFoo murni antarmuka di class C++; berisi metode dan jenis yang didefinisikan dalam Antarmuka IFoo dalam file IFoo.hal, diterjemahkan ke C++ yang jenisnya sesuai jika diperlukan. Tidak berisi detail yang terkait dengan Mekanisme RPC (misalnya, HwBinder) yang digunakan untuk menerapkan antarmuka ini. Class diberi namespace dengan paket dan versinya, misalnya, ::android::hardware::samples::IFoo::V1_0. Klien dan server termasuk {i>header<i} ini: Klien untuk memanggil metode padanya dan server untuk mengimplementasikan metode-metode tersebut.
  • IHwFoo.h. File {i>header<i} yang berisi untuk fungsi yang melakukan serialisasi tipe data yang digunakan dalam antarmuka. Developer tidak boleh menyertakan header-nya secara langsung (tidak berisi ).
  • BpHwFoo.h. Class yang mewarisi dari IFoo dan menjelaskan proxy HwBinder (sisi klien) implementasi antarmuka. Developer tidak boleh merujuk ke class ini secara langsung.
  • BnHwFoo.h. Class yang menyimpan referensi ke implementasi IFoo dan menjelaskan Implementasi antarmuka stub HwBinder (sisi server). Developer tidak boleh merujuk ke class ini secara langsung.
  • FooAll.cpp. Class yang berisi atribut implementasi untuk proxy HwBinder dan Potongan HwBinder. Ketika klien memanggil metode antarmuka, secara otomatis melakukan marshal pada argumen dari klien dan mengirim transaksi ke driver {i>binder kernel<i}, yang mengirimkan transaksi ke stub pada sisi lain (yang kemudian memanggil implementasi server aktual).

File memiliki struktur yang mirip dengan file yang dibuat oleh aidl-cpp (untuk mengetahui detailnya, lihat "Mode passthrough" di Ringkasan HiDL). Satu-satunya file yang dihasilkan secara otomatis yang tidak bergantung pada mekanisme RPC yang digunakan oleh HIDL IFoo.h; semua file lainnya dikaitkan dengan mekanisme HwBinder RPC yang digunakan oleh HIDL. Oleh karena itu, implementasi klien dan server tidak boleh secara langsung merujuk ke apa pun selain IFoo. Untuk mencapai ini, hanya sertakan IFoo.h dan link ke file bersama yang dibuat library.

Klien atau server yang menggunakan antarmuka apa pun dalam sebuah paket harus menyertakan library bersama dari paket tersebut dalam satu (1) lokasi:

  • 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. Dimulai di Android 10, ini juga berisi semua simbol yang sebelumnya di libhidltransport dan libhwbinder.
libhidltransport Menangani pengangkutan panggilan HIDL melalui mekanisme RPC/IPC yang berbeda. Android 10 menghentikan penggunaan library ini.
libhwbinder Simbol khusus binder. Android 10 akan menghentikan penggunaan 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 bawah hardware/interfaces memiliki kualitas berikut:

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