Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

HAL Warisan

A HAL mendefinisikan antarmuka standar untuk diimplementasikan oleh vendor perangkat keras, yang memungkinkan Android menjadi agnostik tentang implementasi driver tingkat rendah. Menggunakan HAL memungkinkan Anda untuk mengimplementasikan fungsionalitas tanpa mempengaruhi atau memodifikasi sistem tingkat yang lebih tinggi. Halaman ini menjelaskan arsitektur yang lebih lama, yang tidak lagi didukung pada Android 8.0. Untuk Android 8.0 dan lebih tinggi, silakan lihat Jenis 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 ), tetapi karena Android tidak mengamanatkan interaksi standar antara implementasi HAL dan driver perangkat, Anda dapat melakukan yang terbaik untuk situasi Anda. Namun, untuk mengaktifkan sistem Android untuk berinteraksi dengan perangkat keras Anda dengan benar, Anda harus mematuhi kontrak yang ditentukan dalam setiap antarmuka HAL khusus perangkat keras.

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

Modul HAL

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 sebuah modul dan berisi metadata seperti versi, nama, dan pembuat 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 digunakan HAL sebagai abstraksi. Setiap HAL khusus perangkat keras biasanya memperluas hw_module_t struct generik dengan informasi tambahan untuk perangkat keras tertentu. Misalnya, di kamera HAL, struct camera_module_t berisi struct hw_module_t bersama dengan 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 Anda menerapkan HAL dan membuat struct modul, Anda harus HAL_MODULE_INFO_SYM . Contoh dari audio Nexus 9 HAL:

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.

Perangkat diwakili oleh struct hw_device_t . Mirip dengan modul, setiap jenis perangkat mendefinisikan versi terperinci dari hw_device_t generik yang berisi pointer fungsi untuk fitur spesifik perangkat keras. Misalnya, audio_hw_device_t 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 sifat-sifat standar ini, setiap antarmuka HAL khusus perangkat keras dapat mendefinisikan lebih banyak fitur dan persyaratannya sendiri. Untuk perincian, lihat dokumentasi referensi HAL serta instruksi individu untuk setiap HAL.

Membangun modul HAL

Implementasi HAL dibangun ke dalam file modul ( .so ) dan secara dinamis ditautkan oleh Android jika perlu. Anda dapat membangun modul dengan membuat file Android.mk untuk setiap implementasi HAL Anda dan menunjuk ke file sumber Anda. Secara umum, perpustakaan Anda bersama harus dinamai dalam format tertentu sehingga dapat ditemukan dan dimuat dengan benar. Skema penamaan sedikit bervariasi dari modul ke modul, tetapi mengikuti pola umum: <module_type>.<device_name> .