HAL cũ

HAL xác định một giao diện chuẩn để các nhà cung cấp phần cứng triển khai, cho phép Android không phụ thuộc vào việc triển khai trình điều khiển cấp thấp hơn. Việc sử dụng HAL cho phép bạn triển khai chức năng mà không ảnh hưởng hoặc sửa đổi hệ thống cấp cao hơn. Trang này mô tả cấu trúc cũ không còn được hỗ trợ kể từ Android 8.0. Đối với Android 8.0 trở lên, vui lòng xem bài viết Tổng quan về HAL.

Thành phần HAL

Hình 1. Thành phần HAL

Bạn phải triển khai HAL (và trình điều khiển) tương ứng cho phần cứng cụ thể mà sản phẩm của bạn cung cấp. Các hoạt động triển khai HAL thường được tích hợp vào các mô-đun thư viện dùng chung (tệp .so), nhưng vì Android không bắt buộc phải có hoạt động tương tác chuẩn giữa hoạt động triển khai HAL và trình điều khiển thiết bị, nên bạn có thể làm những gì phù hợp nhất với trường hợp của mình. Tuy nhiên, để cho phép hệ thống Android tương tác chính xác với phần cứng, bạn phải tuân thủ hợp đồng được xác định trong từng giao diện HAL dành riêng cho phần cứng.

Để đảm bảo rằng HAL có cấu trúc có thể dự đoán được, mỗi giao diện HAL dành riêng cho phần cứng đều có các thuộc tính được xác định trong hardware/libhardware/include/hardware/hardware.h. Giao diện này cho phép hệ thống Android tải các phiên bản chính xác của mô-đun HAL theo cách nhất quán. Giao diện HAL bao gồm hai thành phần: mô-đun và thiết bị.

Mô-đun HAL

Mô-đun đại diện cho quá trình triển khai HAL được đóng gói, được lưu trữ dưới dạng thư viện dùng chung (.so file). Tệp tiêu đề hardware/libhardware/include/hardware/hardware.h xác định một cấu trúc (hw_module_t) đại diện cho một mô-đun và chứa siêu dữ liệu như phiên bản, tên và tác giả của mô-đun. Android sử dụng siêu dữ liệu này để tìm và tải chính xác mô-đun HAL.

Ngoài ra, cấu trúc hw_module_t chứa một con trỏ trỏ đến một cấu trúc khác, hw_module_methods_t, chứa một con trỏ trỏ đến một hàm mở cho mô-đun. Hàm mở này được dùng để bắt đầu giao tiếp với phần cứng mà HAL đang đóng vai trò là một bản tóm tắt. Mỗi HAL dành riêng cho phần cứng thường mở rộng cấu trúc hw_module_t chung bằng thông tin bổ sung cho phần cứng cụ thể đó. Ví dụ: trong HAL máy ảnh, cấu trúc camera_module_t chứa cấu trúc hw_module_t cùng với các con trỏ hàm dành riêng cho máy ảnh khác:

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;

Khi triển khai HAL và tạo cấu trúc mô-đun, bạn phải đặt tên cho cấu trúc đó là HAL_MODULE_INFO_SYM. Ví dụ từ HAL âm thanh 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,
    },
};

Thiết bị HAL

Thiết bị tóm tắt phần cứng của sản phẩm. Ví dụ: mô-đun âm thanh có thể chứa thiết bị âm thanh chính, thiết bị âm thanh USB hoặc thiết bị âm thanh A2DP Bluetooth.

Một thiết bị được biểu thị bằng cấu trúc hw_device_t. Tương tự như mô-đun, mỗi loại thiết bị xác định một phiên bản chi tiết của hw_device_t chung chứa con trỏ hàm cho các tính năng cụ thể của phần cứng. Ví dụ: loại cấu trúc audio_hw_device_t chứa con trỏ hàm đến các thao tác trên thiết bị âm thanh:

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;

Ngoài các thuộc tính tiêu chuẩn này, mỗi giao diện HAL dành riêng cho phần cứng có thể xác định thêm các tính năng và yêu cầu riêng. Để biết thông tin chi tiết, hãy xem tài liệu tham khảo về HAL cũng như hướng dẫn riêng cho từng HAL.

Tạo mô-đun HAL

Các hoạt động triển khai HAL được tích hợp vào các tệp mô-đun (.so) và được Android liên kết động khi thích hợp. Bạn có thể tạo mô-đun bằng cách tạo tệp Android.mk cho từng phương thức triển khai HAL và trỏ đến tệp nguồn. Nhìn chung, bạn phải đặt tên cho thư viện dùng chung theo một định dạng cụ thể để có thể tìm thấy và tải thư viện đó đúng cách. Giao thức đặt tên thay đổi một chút tuỳ theo mô-đun, nhưng tuân theo mẫu chung là: <module_type>.<device_name>.

HAL cũ

Thuật ngữ HAL cũ nói chung là tất cả HAL trước Android 8.0 (không dùng nữa trong Android 8). Phần lớn giao diện hệ thống Android (máy ảnh, âm thanh, cảm biến, v.v.) được xác định trong "hardware/libhardware/include/hardware" và có phiên bản gần đúng và ABI gần như ổn định. Một số hệ thống con (bao gồm Wi-Fi, Lớp giao diện vô tuyến và Bluetooth) có các giao diện không chuẩn hoá khác trong `libhardware_legacy` hoặc xen kẽ trong toàn bộ cơ sở mã. Các HAL cũ không bao giờ đảm bảo độ ổn định nghiêm ngặt.