HIDL dibuat berdasarkan antarmuka, jenis abstrak yang digunakan dalam bahasa berorientasi objek untuk menentukan perilaku. Setiap antarmuka adalah bagian dari paket.
Paket
Nama paket dapat memiliki sublevel seperti package.subpackage
. Direktori
root untuk paket HIDL yang dipublikasikan adalah hardware/interfaces
atau vendor/vendorName
(misalnya, vendor/google
untuk perangkat
Pixel). Nama paket membentuk satu atau beberapa subdirektori dalam direktori
root; semua file yang menentukan paket berada dalam direktori yang sama. Misalnya,
package android.hardware.example.extension.light@2.0
dapat ditemukan
di bagian hardware/interfaces/example/extension/light/2.0
.
Tabel berikut mencantumkan awalan dan lokasi paket:
Awalan paket | Lokasi | Jenis antarmuka |
---|---|---|
android.hardware.* |
hardware/interfaces/* |
HAL |
android.frameworks.* |
frameworks/hardware/interfaces/* |
framework/ terkait |
android.system.* |
system/hardware/interfaces/* |
system/ related |
android.hidl.* |
system/libhidl/transport/* |
core |
Direktori paket berisi file dengan ekstensi .hal
. Setiap
file harus berisi pernyataan package
yang menamai paket dan
versi yang menjadi bagian dari file. File types.hal
, jika ada, tidak menentukan antarmuka, tetapi menentukan jenis data yang dapat diakses oleh setiap antarmuka dalam paket.
Definisi antarmuka
Selain types.hal
, setiap file .hal
lainnya menentukan
antarmuka. Antarmuka biasanya ditentukan sebagai berikut:
interface IBar extends IFoo { // IFoo is another interface // embedded types struct MyStruct {/*...*/}; // interface methods create(int32_t id) generates (MyStruct s); close(); };
Antarmuka tanpa deklarasi extends
eksplisit secara implisit
memperluas dari android.hidl.base@1.0::IBase
(mirip dengan
java.lang.Object
di Java.) Antarmuka IBase, yang secara implisit
diimpor, mendeklarasikan beberapa metode yang dicadangkan yang tidak boleh dan tidak dapat
dideklarasikan ulang di antarmuka yang ditentukan pengguna atau digunakan sebaliknya. Metode ini
mencakup:
ping
interfaceChain
interfaceDescriptor
notifySyspropsChanged
linkToDeath
unlinkToDeath
setHALInstrumentation
getDebugInfo
debug
getHashChain
Proses impor
Pernyataan import
adalah mekanisme HIDL untuk mengakses antarmuka
paket dan jenis dalam paket lain. Pernyataan import
terkait dengan dua entitas:
- Entitying impor, yang dapat berupa paket atau antarmuka
- Entity yangdiimpor, yang dapat berupa paket atau antarmuka
Entitas pengimporan ditentukan oleh lokasi
pernyataan import
. Jika pernyataan berada di dalam
types.hal
paket, apa yang diimpor akan terlihat oleh seluruh paket;
ini adalah impor tingkat paket. Jika pernyataan berada di dalam
file antarmuka, entitas impor adalah antarmuka itu sendiri; ini adalah
impor tingkat antarmuka.
Entity yang diimpor ditentukan oleh nilai setelah kata kunci import
. Nilai tidak harus berupa nama yang sepenuhnya memenuhi syarat; jika komponen
dihilangkan, komponen tersebut akan otomatis diisi dengan informasi dari paket saat ini.
Untuk nilai yang sepenuhnya memenuhi syarat, kasus impor berikut didukung:
- Impor seluruh paket. Jika nilainya adalah nama paket dan versi (sintaksis dijelaskan di bawah), seluruh paket akan diimpor ke entitas pengimpor.
- Impor sebagian. Jika nilainya:
- Antarmuka,
types.hal
paket, dan antarmuka tersebut diimpor ke entitas pengimpor. - UDT yang ditentukan di
types.hal
, lalu hanya UDT tersebut yang diimpor ke entitas pengimpor (jenis lain ditypes.hal
tidak diimpor).
- Antarmuka,
- Impor khusus jenis. Jika nilai menggunakan sintaksis
impor parsial yang dijelaskan di atas, tetapi dengan kata kunci
types
, bukan nama Antarmuka, hanya UDT ditypes.hal
dari paket yang ditetapkan yang diimpor.
Entitas pengimpor mendapatkan akses ke kombinasi dari:
- UDT umum paket yang diimpor yang ditentukan di
types.hal
; - Antarmuka paket yang diimpor (untuk impor paket lengkap) atau antarmuka yang ditentukan (untuk impor sebagian) untuk tujuan memanggilnya, meneruskan handle ke antarmuka tersebut dan/atau mewarisinya.
Pernyataan impor menggunakan sintaksis nama jenis yang sepenuhnya memenuhi syarat untuk memberikan nama dan versi paket atau antarmuka yang diimpor:
import android.hardware.nfc@1.0; // import a whole package import android.hardware.example@1.0::IQuux; // import an interface and types.hal import android.hardware.example@1.0::types; // import just types.hal
Pewarisan antarmuka
Antarmuka dapat berupa ekstensi dari antarmuka yang ditentukan sebelumnya. Ekstensi dapat berupa salah satu dari tiga jenis berikut:
- Antarmuka dapat menambahkan fungsi ke antarmuka lain, dengan menggabungkan API-nya tanpa perubahan.
- Paket dapat menambahkan fungsi ke paket lain, dengan menggabungkan API-nya tanpa perubahan.
- Antarmuka dapat mengimpor jenis dari paket atau dari antarmuka tertentu.
Antarmuka hanya dapat memperluas satu antarmuka lain (tidak ada pewarisan ganda).
Setiap antarmuka dalam paket dengan nomor versi minor selain nol harus memperluas
antarmuka dalam versi paket sebelumnya. Misalnya, jika antarmuka
IBar
dalam paket derivative
versi 4.0 didasarkan pada
(memperluas) antarmuka IFoo
dalam paket
original
versi 1.2, dan paket original
versi 1.3
dibuat, IBar
versi 4.1 tidak dapat memperluas versi 1.3
IFoo
. Sebagai gantinya, IBar
versi 4.1 harus memperluas
IBar
versi 4.0, yang terikat dengan IFoo
versi 1.2.
IBar
versi 5.0 dapat memperluas IFoo
versi 1.3, jika
diinginkan.
Ekstensi antarmuka tidak menyiratkan dependensi library atau penyertaan lintas HAL dalam kode yang dihasilkan—ekstensi ini hanya mengimpor struktur data dan definisi metode di tingkat HIDL. Setiap metode dalam HAL harus diterapkan di HAL tersebut.
Ekstensi vendor
Dalam beberapa kasus, ekstensi vendor diterapkan sebagai subclass dari objek dasar yang mewakili antarmuka inti yang diperluas. Objek yang sama didaftarkan dengan nama dan versi HAL dasar, serta dengan nama dan versi HAL (vendor) ekstensi.
Pembuatan versi
Paket memiliki versi, dan antarmuka memiliki versi paketnya. Versi dinyatakan dalam dua bilangan bulat, major.minor.
- Versi utama tidak kompatibel dengan versi sebelumnya. Menambahkan nomor versi utama akan mereset nomor versi minor ke 0.
- Versi minor kompatibel dengan versi sebelumnya. Penambahan angka minor menunjukkan bahwa versi yang lebih baru sepenuhnya kompatibel dengan versi sebelumnya. Struktur dan metode data baru dapat ditambahkan, tetapi tidak ada struktur data atau tanda tangan metode yang ada yang dapat diubah.
Beberapa versi utama atau minor HAL dapat ada di perangkat secara bersamaan. Namun, versi minor harus lebih diutamakan daripada versi utama karena kode klien yang berfungsi dengan antarmuka versi minor sebelumnya juga berfungsi dengan versi minor berikutnya dari antarmuka yang sama. Untuk detail selengkapnya tentang pembuatan versi dan ekstensi vendor, lihat Pembuatan Versi HIDL.
Ringkasan tata letak antarmuka
Bagian ini merangkum cara mengelola paket antarmuka HIDL (seperti
hardware/interfaces
) dan menggabungkan informasi yang ditampilkan
di seluruh bagian HIDL. Sebelum membaca, pastikan Anda memahami
pembuatan versi HIDL,
konsep hashing dengan
hidl-gen, detail cara menggunakan
HIDL secara umum, dan definisi berikut:
Istilah | Definisi |
---|---|
Antarmuka Biner Aplikasi (ABI) | Antarmuka pemrograman aplikasi plus penautan biner yang diperlukan. |
nama yang sepenuhnya memenuhi syarat (fqName) | Nama untuk membedakan jenis hidl. Contoh:
android.hardware.foo@1.0::IFoo . |
paket | Paket yang berisi antarmuka dan jenis HIDL. Contoh:
android.hardware.foo@1.0 . |
root paket | Paket root yang berisi antarmuka HIDL. Contoh: antarmuka HIDL
android.hardware berada di root paket
android.hardware.foo@1.0 . |
jalur root paket | Lokasi di hierarki sumber Android tempat root paket dipetakan. |
Untuk definisi selengkapnya, lihat Istilah HIDL.
Setiap file dapat ditemukan dari pemetaan root paket dan namanya yang sepenuhnya memenuhi syarat
Root paket ditentukan ke hidl-gen
sebagai argumen
-r android.hardware:hardware/interfaces
. Misalnya, jika
paketnya adalah vendor.awesome.foo@1.0::IFoo
dan hidl-gen
dikirim -r vendor.awesome:some/device/independent/path/interfaces
,
file antarmuka harus berada di
$ANDROID_BUILD_TOP/some/device/independent/path/interfaces/foo/1.0/IFoo.hal
.
Dalam praktiknya, sebaiknya vendor atau OEM bernama awesome
menempatkan antarmuka standarnya di vendor.awesome
. Setelah dipilih, jalur
paket tidak boleh diubah karena sudah di-bake ke dalam ABI
antarmuka.
Pemetaan jalur paket harus unik
Misalnya, jika Anda memiliki -rsome.package:$PATH_A
dan
-rsome.package:$PATH_B
, $PATH_A
harus sama dengan
$PATH_B
untuk direktori antarmuka yang konsisten (hal ini juga membuat
antarmuka pembuatan versi jauh
lebih mudah).
Akar paket harus memiliki file pembuatan versi
Jika membuat jalur paket seperti
-r vendor.awesome:vendor/awesome/interfaces
, Anda juga harus
membuat file
$ANDROID_BUILD_TOP/vendor/awesome/interfaces/current.txt
, yang
harus berisi hash antarmuka yang dibuat menggunakan opsi -Lhash
di
hidl-gen
(ini dibahas secara ekstensif dalam
Hashing dengan
hidl-gen).
Antarmuka berada di lokasi yang tidak bergantung pada perangkat
Dalam praktiknya, sebaiknya bagikan antarmuka antarcabang. Hal ini memungkinkan penggunaan ulang kode maksimum dan pengujian kode maksimum di berbagai perangkat dan kasus penggunaan.