
Lớp trừu tượng phần cứng (HAL) của camera Android kết nối các API khung camera cấp cao trong Camera 2 với trình điều khiển và phần cứng camera cơ bản của bạn. Hệ thống con camera bao gồm các phương thức triển khai cho các thành phần của quy trình camera, trong khi HAL camera cung cấp các giao diện để sử dụng trong việc triển khai phiên bản của các thành phần này.
Kiến trúc
Hình ảnh và danh sách sau đây mô tả các thành phần HAL.

Hình 1. Cấu trúc camera
- khung ứng dụng
- Ở cấp độ khung ứng dụng là mã của ứng dụng, sử dụng API Camera 2 để tương tác với phần cứng camera. Trong nội bộ, mã này gọi các giao diện Binder tương ứng để truy cập vào mã gốc tương tác với camera.
- AIDL
- Bạn có thể tìm thấy giao diện liên kết được liên kết với
CameraService
tại frameworks/av/camera/aidl/android/hardware. Mã được tạo sẽ gọi mã gốc ở cấp thấp hơn để có quyền truy cập vào camera thực và trả về dữ liệu dùng để tạo các đối tượngCameraDevice
và cuối cùng làCameraCaptureSession
ở cấp khung. - khung gốc
- Khung này nằm trong
frameworks/av/
, cung cấp một phiên bản gốc tương đương với các lớpCameraDevice
vàCameraCaptureSession
. Xem thêm Tài liệu tham khảo về camera2 của NDK. - giao diện IPC liên kết
- Giao diện liên kết IPC hỗ trợ giao tiếp qua các ranh giới quy trình.
Có một số lớp liên kết camera nằm trong thư mục
frameworks/av/camera/camera/aidl/android/hardware
gọi vào dịch vụ camera.ICameraService
là giao diện cho dịch vụ camera;ICameraDeviceUser
là giao diện cho một thiết bị camera cụ thể đã mở; vàICameraServiceListener
vàICameraDeviceCallbacks
là các lệnh gọi lạiCameraService
vàCameraDevice
tương ứng cho khung ứng dụng. - dịch vụ camera
- Dịch vụ camera, nằm trong
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, là mã thực tương tác với HAL. - HAL
- Lớp trừu tượng phần cứng xác định giao diện tiêu chuẩn mà dịch vụ camera gọi đến và bạn phải triển khai để phần cứng camera hoạt động đúng cách.
Triển khai HAL
HAL nằm giữa trình điều khiển camera và khung Android cấp cao hơn, đồng thời xác định một giao diện mà bạn phải triển khai để các ứng dụng có thể vận hành chính xác phần cứng camera. Các giao diện HIDL cho Camera HAL được xác định trong hardware/interfaces/camera.
HAL được liên kết thông thường phải triển khai các giao diện HIDL sau:
-
ICameraProvider
: Để liệt kê từng thiết bị và quản lý trạng thái của thiết bị. -
ICameraDevice
: Giao diện thiết bị camera. -
ICameraDeviceSession
: Giao diện phiên thiết bị camera đang hoạt động.
Các phương thức triển khai HIDL tham chiếu có sẵn cho CameraProvider.cpp
,
CameraDevice.cpp
và CameraDeviceSession.cpp
.
Quá trình triển khai này bao gồm các HAL cũ vẫn sử dụng API cũ.
Kể từ Android 8.0, các hoạt động triển khai Camera HAL phải sử dụng API HIDL; không hỗ trợ việc sử dụng giao diện cũ.
Xác thực dữ liệu đầu vào
Vì HAL có quyền truy cập vào các tài nguyên khác với dịch vụ camera, nên ranh giới giữa hai tài nguyên này được coi là ranh giới bảo mật. Điều này có nghĩa là các tham số được truyền từ dịch vụ máy ảnh được coi là không đáng tin cậy và chưa được dọn dẹp. Để ngăn chặn các lỗ hổng bảo mật cho phép kẻ tấn công leo thang đặc quyền hoặc truy cập vào dữ liệu mà chúng không được phép truy cập, HAL camera phải xác thực các tham số được truyền từ dịch vụ camera đến HAL. Điều này bao gồm việc kiểm tra để đảm bảo các giá trị độ dài bộ nhớ đệm nằm trong phạm vi cho phép và làm sạch các tham số trước khi sử dụng và trước khi truyền chúng đến trình điều khiển phần cứng hoặc trình điều khiển hạt nhân.
Thành phần HAL cũ
Phần này mô tả cấu trúc của các thành phần HAL cũ và cách triển khai HAL. Các quy trình triển khai HAL camera trên Android 8.0 trở lên phải sử dụng API HIDL (như mô tả ở trên).
Kiến trúc (cũ)
Hình ảnh và danh sách sau đây mô tả các thành phần HAL camera cũ.

Hình 2. Cấu trúc camera cũ
- khung ứng dụng
- Ở cấp độ khung ứng dụng là mã của ứng dụng, mã này sử dụng API
android.hardware.Camera
để tương tác với phần cứng camera. Trong nội bộ, mã này gọi một lớp kết dính JNI tương ứng để truy cập vào mã gốc tương tác với camera. - JNI
- Mã JNI liên kết với
android.hardware.Camera
nằm trongframeworks/base/core/jni/android_hardware_Camera.cpp
. Mã này gọi mã gốc ở cấp thấp hơn để có quyền truy cập vào camera thực và trả về dữ liệu dùng để tạo đối tượngandroid.hardware.Camera
ở cấp khung. - khung gốc
- Khung gốc được xác định trong
frameworks/av/camera/Camera.cpp
cung cấp một phiên bản gốc tương đương với lớpandroid.hardware.Camera
. Lớp này gọi các proxy liên kết IPC để có quyền truy cập vào dịch vụ camera. - các proxy IPC của trình liên kết
- Các proxy liên kết IPC tạo điều kiện giao tiếp qua ranh giới quy trình.
Có 3 lớp liên kết camera nằm trong thư mục
frameworks/av/camera
gọi vào dịch vụ camera.ICameraService
là giao diện cho dịch vụ máy ảnh,ICamera
là giao diện cho một thiết bị máy ảnh cụ thể đã mở vàICameraClient
là giao diện của thiết bị quay lại khung ứng dụng. - dịch vụ camera
- Dịch vụ camera, nằm trong
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, là mã thực tương tác với HAL. - HAL
- Lớp trừu tượng phần cứng xác định giao diện tiêu chuẩn mà dịch vụ camera gọi đến và bạn phải triển khai để phần cứng camera hoạt động đúng cách.
- trình điều khiển nhân
- Trình điều khiển của camera tương tác với phần cứng camera thực tế và việc triển khai HAL của bạn. Camera và trình điều khiển phải hỗ trợ các định dạng hình ảnh YV12 và NV21 để hỗ trợ xem trước hình ảnh camera trên màn hình và quay video.
Triển khai HAL (cũ)
HAL nằm giữa trình điều khiển camera và khung Android cấp cao hơn, đồng thời xác định một giao diện mà bạn phải triển khai để các ứng dụng có thể vận hành chính xác phần cứng camera. Giao diện HAL được xác định trong các tệp tiêu đề hardware/libhardware/include/hardware/camera.h
và hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
xác định camera_module
, một cấu trúc tiêu chuẩn để lấy thông tin chung về camera, chẳng hạn như mã nhận dạng camera và các thuộc tính chung của tất cả camera (tức là camera trước hay camera sau).
camera.h
chứa mã tương ứng với
android.hardware.Camera
. Tệp tiêu đề này khai báo một cấu trúc camera_device
, đổi lại cấu trúc này chứa một cấu trúc camera_device_ops
có con trỏ đến các hàm triển khai giao diện HAL. Để biết tài liệu về các tham số camera mà nhà phát triển có thể đặt, hãy tham khảo frameworks/av/include/camera/CameraParameters.h
.
Các tham số này được đặt bằng hàm do int
(*set_parameters)(struct camera_device *, const char *parms)
chỉ đến trong HAL.
Để biết ví dụ về cách triển khai HAL, hãy tham khảo cách triển khai cho Galaxy Nexus HAL trong hardware/ti/omap4xxx/camera
.
Định cấu hình thư viện chia sẻ
Thiết lập hệ thống xây dựng Android để đóng gói đúng cách việc triển khai HAL vào một thư viện dùng chung và sao chép thư viện đó vào vị trí thích hợp bằng cách tạo tệp Android.mk
:
- Tạo một thư mục
device/<company_name>/<device_name>/camera
để chứa các tệp nguồn của thư viện. - Tạo tệp
Android.mk
để tạo thư viện dùng chung. Đảm bảo rằng tệp makefile chứa các dòng sau:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Thư viện của bạn phải có tên là
camera.<device_name>
(.so
sẽ được tự động thêm vào), để Android có thể tải thư viện một cách chính xác. Ví dụ: hãy xem tệp makefile cho camera Galaxy Nexus nằm tronghardware/ti/omap4xxx/Android.mk
. - Chỉ định thiết bị của bạn có các tính năng camera bằng cách sao chép các tệp XML tính năng cần thiết trong thư mục
frameworks/native/data/etc
bằng tệp makefile của thiết bị. Ví dụ: để chỉ định rằng thiết bị của bạn có đèn flash của camera và có thể tự động lấy nét, hãy thêm các dòng sau vào tệp makefile<device>/<company_name>/<device_name>/device.mk
của thiết bị:PRODUCT_COPY_FILES := \ ... PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
Để biết ví dụ về tệp makefile của thiết bị, hãy xem
device/samsung/tuna/device.mk
. - Khai báo các chức năng về độ phân giải, định dạng và bộ mã hoá và giải mã nội dung nghe nhìn của camera trong tệp XML
device/<company_name>/<device_name>/media_profiles.xml
vàdevice/<company_name>/<device_name>/media_codecs.xml
. Để biết thông tin chi tiết, hãy xem phần Hiển thị các bộ mã hoá và giải mã cho khung. - Thêm các dòng sau vào tệp
device/<company_name>/<device_name>/device.mk
makefile của thiết bị để sao chép các tệpmedia_profiles.xml
vàmedia_codecs.xml
vào vị trí thích hợp:# media config xml file PRODUCT_COPY_FILES += \ <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml # media codec config xml file PRODUCT_COPY_FILES += \ <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
- Để đưa ứng dụng Máy ảnh vào hình ảnh hệ thống của thiết bị, hãy chỉ định ứng dụng này trong biến
PRODUCT_PACKAGES
trong tệpdevice/<company>/<device>/device.mk
makefile của thiết bị:PRODUCT_PACKAGES := \ Gallery2 \ ...