HIDL dibangun di sekitar antarmuka, tipe abstrak yang digunakan dalam bahasa berorientasi objek untuk mendefinisikan perilaku. Setiap antarmuka adalah bagian dari sebuah paket.
Paket
Nama paket dapat memiliki sublevel seperti package.subpackage
. Direktori root untuk paket HIDL yang diterbitkan adalah hardware/interfaces
atau vendor/vendorName
(mis vendor/google
untuk perangkat Pixel). Nama paket membentuk satu atau lebih subdirektori di bawah direktori root; semua file yang mendefinisikan sebuah paket berada di direktori yang sama. Misalnya, package android.hardware.example.extension.light@2.0
dapat ditemukan di 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/* | kerangka kerja/ terkait |
android.system.* | system/hardware/interfaces/* | sistem/ terkait |
android.hidl.* | system/libhidl/transport/* | inti |
Direktori paket berisi file dengan ekstensi .hal
. Setiap file harus berisi pernyataan package
yang menamai paket dan versi file tersebut menjadi bagiannya. File types.hal
, jika ada, tidak mendefinisikan antarmuka melainkan mendefinisikan tipe data yang dapat diakses oleh setiap antarmuka dalam paket.
Definisi antarmuka
Selain dari types.hal
, setiap file .hal
lainnya mendefinisikan sebuah antarmuka. Sebuah antarmuka biasanya didefinisikan 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 perluasan eksplisit secara implisit extends
dari android.hidl.base@1.0::IBase
(mirip dengan java.lang.Object
di Java.) Antarmuka IBase, yang diimpor secara implisit, mendeklarasikan beberapa metode yang dicadangkan yang tidak boleh dan tidak dapat dideklarasikan ulang dalam antarmuka yang ditentukan pengguna atau digunakan sebaliknya. Metode ini meliputi:
-
ping
-
interfaceChain
-
interfaceDescriptor
-
notifySyspropsChanged
-
linkToDeath
-
unlinkToDeath
-
setHALInstrumentation
-
getDebugInfo
-
debug
-
getHashChain
Pengimporan
Pernyataan import
adalah mekanisme HIDL untuk mengakses antarmuka paket dan mengetik di paket lain. Pernyataan import
menyangkut dirinya dengan dua entitas:
- Entitas impor, yang dapat berupa paket atau antarmuka; dan
- Entitas import ed , yang juga dapat berupa paket atau antarmuka.
Entitas pengimpor ditentukan oleh lokasi pernyataan import
. Ketika pernyataan berada di dalam sebuah paket types.hal
, apa yang sedang diimpor terlihat oleh seluruh paket; ini adalah impor tingkat paket . Ketika pernyataan berada di dalam file antarmuka, entitas pengimpor adalah antarmuka itu sendiri; ini adalah impor tingkat antarmuka .
Entitas yang diimpor ditentukan oleh nilai setelah kata kunci import
. Nilai tidak harus berupa nama yang sepenuhnya memenuhi syarat; jika komponen dihilangkan, maka secara otomatis diisi dengan informasi dari paket saat ini. Untuk nilai yang sepenuhnya memenuhi syarat, kasus impor berikut didukung:
- Impor paket utuh . Jika nilainya adalah nama paket dan versi (sintaks yang dijelaskan di bawah), maka seluruh paket diimpor ke entitas pengimpor.
- Impor sebagian . Jika nilainya adalah:
- Antarmuka,
types.hal
paket, dan antarmuka itu diimpor ke entitas pengimpor. - Sebuah UDT didefinisikan dalam
types.hal
, maka hanya UDT yang diimpor ke entitas pengimpor (jenis lain dalamtypes.hal
tidak diimpor).
- Antarmuka,
- Impor khusus jenis . Jika nilai menggunakan sintaks impor parsial yang dijelaskan di atas, tetapi dengan
types
kata kunci alih-alih nama Antarmuka, hanya UDT dalamtypes.hal
dari paket yang ditunjuk yang diimpor.
Entitas pengimpor mendapatkan akses ke kombinasi:
- UDT umum paket yang diimpor didefinisikan dalam
types.hal
; - Antarmuka paket yang diimpor (untuk impor seluruh paket) atau antarmuka yang ditentukan (untuk impor sebagian) untuk tujuan memanggilnya, memberikan pegangan kepada mereka dan/atau mewarisi darinya.
Pernyataan impor menggunakan sintaks nama tipe 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
Warisan antarmuka
Antarmuka dapat menjadi perpanjangan dari antarmuka yang telah ditentukan sebelumnya. Ekstensi dapat berupa salah satu dari tiga jenis berikut:
- Antarmuka dapat menambahkan fungsionalitas ke yang lain, menggabungkan API-nya tidak berubah.
- Paket dapat menambahkan fungsionalitas ke yang lain, menggabungkan API-nya tidak berubah.
- Antarmuka dapat mengimpor jenis dari paket atau dari antarmuka tertentu.
Antarmuka hanya dapat memperluas satu antarmuka lain (tidak ada pewarisan berganda). Setiap antarmuka dalam paket dengan nomor versi minor bukan nol harus memperluas antarmuka dalam versi paket sebelumnya. Misalnya, jika antarmuka IBar
dalam versi 4.0 dari derivative
paket didasarkan pada (memperluas) antarmuka IFoo
di versi 1.2 dari paket original
, dan versi 1.3 dari paket original
dibuat, IBar
versi 4.1 tidak dapat memperpanjang versi 1.3 dari IFoo
. Sebaliknya, IBar
versi 4.1 harus memperluas IBar
versi 4.0, yang terikat dengan IFoo
versi 1.2. IBar
versi 5.0 dapat memperpanjang IFoo
versi 1.3, jika diinginkan.
Ekstensi antarmuka tidak menyiratkan ketergantungan perpustakaan atau penyertaan lintas-HAL dalam kode yang dihasilkan—mereka hanya mengimpor struktur data dan definisi metode pada tingkat HIDL. Setiap metode dalam HAL harus diimplementasikan dalam HAL tersebut.
Ekstensi vendor
Dalam beberapa kasus, ekstensi vendor akan diimplementasikan sebagai subkelas dari objek dasar yang mewakili antarmuka inti yang mereka kembangkan. Objek yang sama akan didaftarkan di bawah nama dan versi HAL dasar, dan di bawah nama dan versi HAL ekstensi (vendor).
Versi
Paket berversi, dan antarmuka memiliki versi paketnya. Versi dinyatakan dalam dua bilangan bulat, mayor . kecil .
- Versi utama tidak kompatibel ke belakang. Menaikkan nomor versi utama akan mengatur ulang nomor versi minor ke 0.
- Versi minor kompatibel ke belakang. Penambahan angka minor menunjukkan 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 besar atau kecil dari HAL dapat hadir pada perangkat secara bersamaan. Namun, versi minor harus lebih disukai daripada versi mayor karena kode klien yang berfungsi dengan antarmuka versi minor sebelumnya juga akan berfungsi dengan versi minor yang lebih baru 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 disajikan di seluruh bagian HIDL. Sebelum membaca, pastikan Anda sudah familiar dengan HIDL Versioning , konsep hashing di Hashing dengan hidl-gen , rincian bekerja dengan HIDL secara umum , dan definisi berikut:
Ketentuan | Definisi |
---|---|
Antarmuka Biner Aplikasi (ABI) | Antarmuka pemrograman aplikasi + hubungan biner apa pun yang diperlukan. |
Nama yang sepenuhnya memenuhi syarat (fqName) | Nama untuk membedakan tipe hidl. Contoh: android.hardware.foo@1.0::IFoo . |
Kemasan | Paket yang berisi antarmuka dan tipe HIDL. Contoh: android.hardware.foo@1.0 . |
Akar paket | Paket root yang berisi antarmuka HIDL. Contoh: antarmuka HIDL android.hardware ada dalam paket root android.hardware.foo@1.0 . |
Jalur root paket | Lokasi di pohon sumber Android tempat root paket dipetakan. |
Untuk definisi lebih lanjut, lihat Terminologi HIDL.
Setiap file dapat ditemukan dari pemetaan root paket dan nama yang sepenuhnya memenuhi syarat
Akar 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
, maka file antarmuka harus ditempatkan di $ANDROID_BUILD_TOP/some/device/independent/path/interfaces/foo/1.0/IFoo.hal
.
Dalam praktiknya, direkomendasikan untuk vendor atau OEM bernama awesome
untuk menempatkan antarmuka standar mereka di vendor.awesome
. Setelah jalur paket dipilih, itu tidak boleh diubah karena ini dimasukkan 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 (ini juga membuat versi antarmuka menjadi lebih mudah).
Root paket harus memiliki file versi
Jika Anda 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 -Lhash
opsi di hidl-gen
(ini dibahas secara luas di Hashing dengan hidl-gen ).
Antarmuka masuk ke lokasi yang tidak bergantung pada perangkat
Dalam praktiknya, disarankan untuk berbagi antarmuka antar cabang. Ini memungkinkan penggunaan ulang kode maksimum dan pengujian kode maksimum di berbagai perangkat dan kasus penggunaan.