HAL cũ

HAL (Lớp trừu tượng phần cứng) định nghĩa giao diện tiêu chuẩn để các nhà cung cấp phần cứng triển khai, cho phép Android không quan tâm đến các hoạt động 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 hỗ trợ kể từ Android 8.0. Đối với Android 8.0 trở lên, vui lòng xem 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 mà sản phẩm của bạn cung cấp. Việc triển khai HAL (Lớp trừu tượng phần cứng) thường được tích hợp sẵn mô-đun thư viện được chia sẻ (.so tệp), nhưng vì Android không bắt buộc một tương tác chuẩn giữa triển khai HAL (Lớp trừu tượng phần cứng) và trình điều khiển thiết bị, bạn có thể làm những gì tốt nhất cho tình huống của bạn. Tuy nhiên, để cho phép hệ thống Android tương tác chính xác với phần cứng của mình, thì bạn phải tuân thủ được xác định trong mỗi giao diện HAL dành riêng cho phần cứng.

Để đảm bảo rằng HAL có cấu trúc dự đoán được, mỗi phần cứng dành riêng cho Giao diện HAL 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 phiên bản chính xác của mô-đun HAL trong một 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ột mô-đun đại diện cho cách triển khai HAL được đóng gói, được lưu trữ dưới dạng thư viện chia sẻ (.so file). Chiến lược phát hành đĩa đơn 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. của Android sử dụng siêu dữ liệu này để tìm và tải mô-đun HAL (Lớp trừu tượng phần cứng) đúng cách.

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

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 lớp đó HAL_MODULE_INFO_SYM. Ví dụ từ HAL âm thanh của 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ị trừu tượng hoá phần cứng của sản phẩm. Ví dụ: một đoạn âm thanh mô-đun có thể chứa thiết bị âm thanh chính, thiết bị âm thanh USB hoặc Bluetooth Thiết bị âm thanh A2DP.

Một thiết bị được biểu thị bằng cấu trúc hw_device_t. Tương tự như mỗi loại thiết bị xác định một phiên bản chi tiết của mô-đun chung hw_device_t chứa con trỏ hàm cho các tính năng cụ thể của phần cứng. Ví dụ: kiểu cấu trúc audio_hw_device_t chứa con trỏ hàm đến hoạt động của 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 trên, mỗi HAL (Lớp trừu tượng phần cứng) 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.

Xây dựng mô-đun HAL

Hoạt động triển khai HAL được tích hợp trong các tệp mô-đun (.so) và tự động được Android liên kết khi thích hợp. Bạn có thể xây dựng mô-đun của mình bằng cách tạo tệp Android.mk cho từng hoạt động triển khai HAL và trỏ đến tệp nguồn của bạn. Nhìn chung, thư viện dùng chung của bạn phải được đặt tên theo định dạng cụ thể để chúng có thể được tìm thấy và tải đúng cách. Việc đặt tên có sự khác biệt đôi chút giữa các mô-đun, nhưng đều tuân theo mẫu chung trong số: <module_type>.<device_name>.

Lớp trừu tượng phần cứng (HAL) cũ

Thuật ngữ HAL kế thừa dùng để chỉ tất cả các HAL phiên bản trước của Android 8.0 (không dùng nữa trong Android 8). Chiến lược phát hành đĩa đơn hàng loạt 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" (phần cứng/libhardware/bao gồm/phần cứng) và có phiên bản thô và ABI gần như ổn định. Đáp 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 hệ thống khác chưa được chuẩn hoá các giao diện "libhardware_legacy" hoặc được đặt xen kẽ trong toàn bộ cơ sở mã. HAL cũ không bao giờ cung cấp sự đảm bảo ổn định.