HAL mendefinisikan antarmuka standar untuk implementasi vendor perangkat keras, yang memungkinkan Android menjadi agnostik tentang implementasi driver di tingkat yang lebih rendah. Menggunakan HAL memungkinkan Anda untuk mengimplementasikan fungsionalitas tanpa mempengaruhi atau memodifikasi level sistem yang lebih tinggi. Halaman ini menjelaskan arsitektur lama, yang didukung mulai Android 8.0. Untuk Android 8.0 dan yang lebih baru, lihat Ringkasan HAL.
Anda harus mengimplementasikan HAL (dan {i>driver)<i} yang sesuai untuk
perangkat keras yang disediakan
oleh produk Anda. Implementasi HAL biasanya
dibangun dalam
modul library bersama (file .so
), tetapi karena Android tidak mewajibkan
interaksi standar antara implementasi HAL
dan {i>driver <i}perangkat, Anda bisa
lakukan yang terbaik
untuk situasi Anda. Namun, untuk mengaktifkan sistem Android
berinteraksi dengan benar dengan hardware, Anda harus mematuhi
kontrak yang didefinisikan dalam setiap
antarmuka HAL khusus perangkat keras.
Untuk menjamin bahwa HAL memiliki struktur yang dapat diprediksi, setiap hardware tertentu
Antarmuka HAL memiliki
properti yang ditentukan dalam
hardware/libhardware/include/hardware/hardware.h
. Antarmuka ini
memungkinkan sistem Android memuat versi modul HAL yang benar dalam
konsisten. Antarmuka HAL terdiri dari dua komponen: modul dan perangkat.
Modul HAL
Modul merepresentasikan paket implementasi HAL Anda, yang disimpan sebagai
galeri foto bersama (.so file
). Tujuan
File header hardware/libhardware/include/hardware/hardware.h
menentukan struct (hw_module_t
) yang merepresentasikan modul dan
berisi metadata seperti versi, nama, dan penulis modul. Android
menggunakan {i>metadata<i} ini untuk mencari dan
memuat modul HAL dengan benar.
Selain itu, struct hw_module_t
berisi pointer untuk
struct lain, hw_module_methods_t
, yang berisi pointer untuk
fungsi terbuka untuk modul. Fungsi terbuka ini digunakan
untuk memulai
komunikasi dengan perangkat keras di mana
HAL berfungsi sebagai abstraksi.
Setiap HAL khusus hardware biasanya memperluas hw_module_t
{i>struct <i}dengan informasi tambahan
tentang perangkat keras tersebut. Sebagai
misalnya, di HAL kamera, struct camera_module_t
berisi
Struktur hw_module_t
beserta fungsi khusus kamera lainnya
petunjuk:
typedef struct camera_module { hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); } camera_module_t;
Saat Anda mengimplementasikan HAL dan membuat struct modul, Anda harus menamainya
HAL_MODULE_INFO_SYM
. Contoh dari HAL audio Nexus 9:
struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = AUDIO_MODULE_API_VERSION_0_1, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = AUDIO_HARDWARE_MODULE_ID, .name = "NVIDIA Tegra Audio HAL", .author = "The Android Open Source Project", .methods = &hal_module_methods, }, };
Perangkat HAL
Perangkat mengabstraksi hardware produk Anda. Misalnya, audio dapat berisi perangkat audio utama, perangkat audio USB, atau Bluetooth Perangkat audio A2DP.
Perangkat direpresentasikan oleh struct hw_device_t
. Serupa dengan
modul, setiap jenis perangkat menentukan versi detail dari
hw_device_t
yang berisi pointer fungsi untuk fitur tertentu
dari hardware. Misalnya, jenis struct audio_hw_device_t
berisi pointer fungsi ke operasi perangkat audio:
struct audio_hw_device { struct hw_device_t common; /** * used by audio flinger to enumerate what devices are supported by * each audio_hw_device implementation. * * Return value is a bitmask of 1 or more values of audio_devices_t */ uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); ... }; typedef struct audio_hw_device audio_hw_device_t;
Selain properti standar ini, setiap HAL khusus perangkat keras dapat mendefinisikan lebih banyak fitur dan persyaratannya sendiri. Untuk mengetahui detailnya, lihat dokumentasi referensi HAL serta instruksi individu untuk setiap HAL.
Membuat modul HAL
Implementasi HAL dibangun ke dalam file modul (.so
) dan
ditautkan secara dinamis oleh Android bila diperlukan. Anda dapat membuat modul dengan
membuat file Android.mk
untuk setiap implementasi HAL Anda
dan menunjuk ke file sumber Anda. Secara umum, {i>shared library<i}
Anda harus
dinamai dalam format tertentu sehingga mereka
dapat ditemukan dan dimuat dengan benar. Penamaan
skema bervariasi di setiap modul, tetapi mengikuti pola umumnya
dari: <module_type>.<device_name>
.