HAL Lama

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.

Komponen HAL

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

HAL Lama

Istilah Legacy HAL secara luas mengacu pada semua HAL pra-Android 8.0 (tidak digunakan lagi di Android 8). Tujuan sebagian besar antarmuka sistem Android (kamera, audio, sensor, dll.) ditentukan dalam `hardware/libhardware/include/hardware` dan memiliki pembuatan versi kasar serta ABI yang kira-kira stabil. J beberapa subsistem (termasuk Wi-Fi, {i>Radio Interface Layer<i}, dan Bluetooth) memiliki antarmuka dalam `libhardware_legacy` atau diselingi di seluruh codebase. HAL lama tidak pernah yang memberikan jaminan stabilitas keras.