HAL xác định giao diện chuẩn để các nhà cung cấp phần cứng triển khai, cho phép Android không biết gì về việc triển khai trình điều khiển cấp thấp hơn. 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ả kiến trúc cũ hơn, 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 Tổng quan về HAL .
![thành phần HAL](https://source.android.google.cn/static/docs/core/architecture/images/ape_fwk_hal.png?authuser=4&hl=vi)
Hình 1. Các 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. Việc 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ó sự tương tác tiêu chuẩn giữa 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ì tốt nhất cho 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 của bạn, 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 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 của bạn một 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ột mô-đun thể hiện việc triển khai HAL được đóng gói của bạn, đượ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 mô-đun HAL một cách chính xác.
Ngoài ra, cấu trúc hw_module_t
chứa một con trỏ tới một cấu trúc khác, hw_module_methods_t
, chứa một con trỏ tới một hàm mở cho mô-đun. Hàm mở này được sử dụng để bắt đầu giao tiếp với phần cứng mà HAL đang đóng vai trò trừu tượng hóa. 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 với thông tin bổ sung cho phần cứng cụ thể đó. Ví dụ: trong máy ảnh HAL, 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 bạn triển khai HAL và tạo cấu trúc mô-đun, bạn phải đặt tên cho nó 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
Một thiết bị tóm tắt phần cứng của sản phẩm của bạn. 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 Bluetooth A2DP.
Một thiết bị được đại diện bởi cấu trúc hw_device_t
. Tương tự như một 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 các 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 các con trỏ hàm tới các 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 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 của nó. Để biết chi tiết, hãy xem tài liệu tham khảo HAL cũng như các hướng dẫn riêng cho từng HAL.
Xây dựng mô-đun HAL
Việc 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ể xây dựng mô-đun của mình bằng cách tạo tệp Android.mk
cho từng triển khai HAL và trỏ đến tệp nguồn của bạn. Nói chung, thư viện dùng chung của bạn phải được đặt tên theo định dạng cụ thể để có thể tìm thấy và tải chúng đúng cách. Sơ đồ đặt tên thay đổi đôi chút tùy theo mô-đun, nhưng tuân theo mẫu chung là: <module_type>.<device_name>
.