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.
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>
.