HAL menentukan antarmuka standar yang akan diterapkan oleh vendor hardware, yang memungkinkan Android menjadi agnostik tentang implementasi driver tingkat rendah. Dengan menggunakan HAL, Anda dapat menerapkan fungsi tanpa memengaruhi atau mengubah sistem level yang lebih tinggi. Halaman ini menjelaskan arsitektur lama, yang tidak lagi didukung mulai Android 8.0. Untuk Android 8.0 dan yang lebih baru, lihat Ringkasan HAL.

Gambar 1. Komponen HAL
Anda harus menerapkan HAL (dan driver) yang sesuai untuk hardware
tertentu yang disediakan produk Anda. Implementasi HAL biasanya di-build ke dalam
modul library bersama (file .so
), tetapi karena Android tidak mewajibkan
interaksi standar antara implementasi HAL dan driver perangkat, Anda dapat
melakukan hal yang terbaik untuk situasi Anda. Namun, agar sistem Android dapat
berinteraksi dengan hardware dengan benar, Anda harus mematuhi
kontrak yang ditentukan di setiap antarmuka HAL khusus hardware.
Untuk menjamin bahwa HAL memiliki struktur yang dapat diprediksi, setiap antarmuka HAL khusus
hardware memiliki properti yang ditentukan di
hardware/libhardware/include/hardware/hardware.h
. Antarmuka ini
memungkinkan sistem Android memuat versi modul HAL yang benar dengan
cara yang konsisten. Antarmuka HAL terdiri dari dua komponen: modul dan perangkat.
Modul HAL
Modul mewakili implementasi HAL yang dipaketkan, yang disimpan sebagai
library bersama (.so file
). File header
hardware/libhardware/include/hardware/hardware.h
menentukan struct (hw_module_t
) yang mewakili modul dan
berisi metadata seperti versi, nama, dan penulis modul. Android
menggunakan metadata ini untuk menemukan dan memuat modul HAL dengan benar.
Selain itu, struct hw_module_t
berisi pointer ke
struct lain, hw_module_methods_t
, yang berisi pointer ke
fungsi terbuka untuk modul. Fungsi terbuka ini digunakan untuk memulai
komunikasi dengan hardware yang digunakan HAL sebagai abstraksi.
Setiap HAL khusus hardware biasanya memperluas struct hw_module_t
generik dengan informasi tambahan untuk hardware tertentu tersebut. Misalnya, di HAL kamera, struct camera_module_t
berisi
struct hw_module_t
beserta pointer fungsi khusus kamera
lainnya:
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 menerapkan 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 memisahkan hardware produk Anda. Misalnya, modul audio dapat berisi perangkat audio utama, perangkat audio USB, atau perangkat audio A2DP Bluetooth.
Perangkat direpresentasikan oleh struct hw_device_t
. Serupa dengan
modul, setiap jenis perangkat menentukan versi hw_device_t
generik yang mendetail dan berisi pointer fungsi untuk fitur
hardware tertentu. 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 antarmuka HAL khusus hardware dapat menentukan lebih banyak fitur dan persyaratannya sendiri. Untuk mengetahui detailnya, lihat dokumentasi referensi HAL serta petunjuk masing-masing untuk setiap HAL.
Mem-build modul HAL
Implementasi HAL di-build ke dalam file modul (.so
) dan
ditautkan secara dinamis oleh Android jika sesuai. Anda dapat mem-build modul dengan
membuat file Android.mk
untuk setiap implementasi HAL
dan mengarahkan ke file sumber. Secara umum, library bersama Anda harus
diberi nama dalam format tertentu agar dapat ditemukan dan dimuat dengan benar. Skema penamaan
bervariasi sedikit dari modul ke modul, tetapi mengikuti pola umum
dari: <module_type>.<device_name>
.