HAL Lama

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.

Komponen 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>.

HAL Lama

Istilah HAL Lama secara luas mengacu pada semua HAL sebelum Android 8.0 (tidak digunakan lagi di Android 8). Sebagian besar antarmuka sistem Android (kamera, audio, sensor, dll.) ditentukan di `hardware/libhardware/include/hardware` dan memiliki versi kasar serta ABI yang relatif stabil. Beberapa subsistem (termasuk Wi-Fi, Radio Interface Layer, dan Bluetooth) memiliki antarmuka non-standar lainnya di `libhardware_legacy` atau diselingi di seluruh codebase. HAL lama tidak pernah memberikan jaminan stabilitas yang kuat.