HAL lama

HAL mendefinisikan antarmuka standar untuk diterapkan oleh vendor perangkat keras, yang memungkinkan Android bersikap agnostik terhadap implementasi driver tingkat rendah. Menggunakan HAL memungkinkan Anda mengimplementasikan fungsionalitas tanpa mempengaruhi atau memodifikasi sistem tingkat yang lebih tinggi. Halaman ini menjelaskan arsitektur lama, yang tidak lagi didukung mulai Android 8.0. Untuk Android 8.0 dan lebih tinggi, silakan lihat Ikhtisar HAL .

komponen HAL

Gambar 1. Komponen HAL

Anda harus menerapkan HAL (dan driver) yang sesuai untuk perangkat keras spesifik yang disediakan produk Anda. Implementasi HAL biasanya dibangun ke dalam modul perpustakaan bersama (file .so ), namun karena Android tidak mewajibkan interaksi standar antara implementasi HAL dan driver perangkat, Anda dapat melakukan yang terbaik untuk situasi Anda. Namun, agar sistem Android dapat berinteraksi dengan benar dengan perangkat keras Anda, Anda harus mematuhi kontrak yang ditentukan di setiap antarmuka HAL khusus perangkat keras.

Untuk menjamin bahwa HAL memiliki struktur yang dapat diprediksi, setiap antarmuka HAL khusus perangkat keras memiliki properti yang ditentukan dalam hardware/libhardware/include/hardware/hardware.h . Antarmuka ini memungkinkan sistem Android memuat versi modul HAL Anda yang benar secara konsisten. Antarmuka HAL terdiri dari dua komponen: modul dan perangkat.

modul HAL

Sebuah modul mewakili implementasi HAL paket Anda, yang disimpan sebagai perpustakaan bersama ( .so file ). File header hardware/libhardware/include/hardware/hardware.h mendefinisikan 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 perangkat keras yang HAL berfungsi sebagai abstraksinya. Setiap HAL khusus perangkat keras biasanya memperluas struct hw_module_t generik dengan informasi tambahan untuk perangkat keras tertentu. Misalnya, di kamera HAL, struct camera_module_t berisi struct hw_module_t bersama dengan penunjuk 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 Anda mengimplementasikan HAL dan membuat struct modul, Anda harus menamainya HAL_MODULE_INFO_SYM . Contoh dari audio HAL 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 perangkat keras produk Anda. Misalnya, modul audio dapat berisi perangkat audio utama, perangkat audio USB, atau perangkat audio Bluetooth A2DP.

Sebuah perangkat diwakili oleh struct hw_device_t . Mirip dengan modul, setiap jenis perangkat mendefinisikan versi rinci dari hw_device_t generik yang berisi penunjuk fungsi untuk fitur spesifik perangkat keras. Misalnya, tipe struct audio_hw_device_t berisi penunjuk 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 perangkat keras dapat menentukan lebih banyak fitur dan persyaratannya sendiri. Untuk detailnya, lihat dokumentasi referensi HAL serta instruksi individual untuk setiap HAL.

Membangun modul HAL

Implementasi HAL dibangun ke dalam file modul ( .so ) dan ditautkan secara dinamis oleh Android jika diperlukan. Anda dapat membuat modul dengan membuat file Android.mk untuk setiap implementasi HAL dan mengarahkan ke file sumber Anda. Secara umum, perpustakaan bersama Anda harus diberi nama dalam format tertentu agar dapat ditemukan dan dimuat dengan benar. Skema penamaan sedikit berbeda dari satu modul ke modul lainnya, namun mengikuti pola umum: <module_type>.<device_name> .

Warisan HAL

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