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

Hình 1. Kiến trúc camera
- khung ứng dụng
- Ở cấp khung ứng dụng là mã của ứng dụng, mã này sử dụng API Máy ảnh 2 để tương tác với phần cứng máy ảnh. Trong nội bộ, mã này gọi các giao diện Binder tương ứng để truy cập mã gốc tương tác với máy ảnh.
- AIDL
- Bạn có thể tìm thấy giao diện chất kết dính liên kết với
CameraService
tại framework / av / camera / aidl / android / hardware . Mã được tạo gọi mã gốc cấp thấp hơn để có quyền truy cập vào camera vật lý và trả về dữ liệu được sử dụng để tạo các đối tượngCameraDevice
và cuối cùngCameraCaptureSession
ở cấp khung. - khung bản địa
- Khuôn khổ này nằm trong
frameworks/av/
cung cấp một 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 NDK camera2 . - giao diện IPC kết dính
- Giao diện chất kết dính IPC tạo điều kiện giao tiếp qua các ranh giới quy trình. Có một số lớp chất kết dính 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 của dịch vụ máy ảnh;ICameraDeviceUser
là giao diện của một thiết bị máy ảnh được mở cụ thể; 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ế 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ụ máy ảnh gọi vào và bạn phải triển khai để phần cứng máy ảnh hoạt động chính xác.
Triển khai HAL
HAL nằm giữa trình điều khiển máy ảnh và khung Android cấp cao hơn và xác định 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 máy ảnh. Các giao diện HIDL cho Camera HAL được xác định trong phần cứng / giao diện / camera .
Một HAL được liên kết điển hình phải triển khai các giao diện HIDL sau:
-
ICameraProvider
: Để liệt kê các thiết bị riêng lẻ và quản lý trạng thái của chúng. -
ICameraDevice
: Giao diện thiết bị máy ảnh. -
ICameraDeviceSession
: Giao diện phiên thiết bị máy ảnh đang hoạt động.
Các triển khai HIDL tham chiếu có sẵn cho CameraProvider.cpp
, CameraDevice.cpp
và CameraDeviceSession.cpp
. Việc triển khai kết thúc các HAL cũ vẫn sử dụng API kế thừa . Bắt đầu với Android 8.0, việc triển khai Camera HAL phải sử dụng API HIDL; việc sử dụng giao diện cũ không được hỗ trợ.
Xác thực đầu vào
Bởi vì HAL có quyền truy cập vào các tài nguyên khác với dịch vụ camera, ranh giới giữa hai dịch vụ này được coi là ranh giới bảo mật. Điều này có nghĩa là các thông số được truyền từ dịch vụ camera được coi là không đáng tin cậy và không được vệ sinh. Để ngăn chặn các lỗ hổng bảo mật cho phép kẻ tấn công nâng cao đặc quyền hoặc truy cập dữ liệu mà chúng không có ý định có quyền truy cập, camera HAL phải xác thực các thông số được chuyển từ dịch vụ camera tới HAL. Điều này bao gồm việc kiểm tra xem các giá trị độ dài bộ đệm có 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 chuyển chúng đến trình điều khiển phần cứng hoặc nhân.
Các thành phần HAL kế thừa
Phần này mô tả kiến trúc của các thành phần HAL kế thừa và cách triển khai HAL. Việc triển khai Camera HAL trên Android 8.0 trở lên phải sử dụng API HIDL thay thế, được mô tả ở trên.
Kiến trúc (kế thừa)
Hình sau và danh sách mô tả các thành phần HAL của máy ảnh cũ.

Hình 2. Kiến trúc camera kế thừa
- khung ứng dụng
- Ở cấp khung ứng dụng là mã của ứng dụng, sử dụng API
android.hardware.Camera
để tương tác với phần cứng máy ảnh. Bên trong, mã này gọi một lớp keo JNI tương ứng để truy cập mã gốc tương tác với máy ảnh. - JNI
- Mã JNI được 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 vật lý và trả về dữ liệu được sử dụng để tạo đối tượngandroid.hardware.Camera
ở cấp khung. - khung bản địa
- Khuôn khổ gốc được định nghĩa trong
frameworks/av/camera/Camera.cpp
cung cấp một bản gốc tương đương với lớpandroid.hardware.Camera
. Lớp này gọi proxy kết dính IPC để có quyền truy cập vào dịch vụ camera. - kết dính các proxy IPC
- Các proxy kết dính IPC tạo điều kiện giao tiếp qua các ranh giới quy trình. Có ba lớp chất kết dính camera nằm trong thư mục
frameworks/av/camera
gọi vào dịch vụ camera.ICameraService
là giao diện của dịch vụ máy ảnh,ICamera
là giao diện của một thiết bị máy ảnh được mở cụ thể vàICameraClient
là giao diện của thiết bị quay trở 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ế 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ụ máy ảnh gọi vào và bạn phải triển khai để phần cứng máy ảnh hoạt động chính xác.
- trình điều khiển hạt nhân
- Trình điều khiển của máy ảnh tương tác với phần cứng máy ảnh thực tế và việc bạn triển khai HAL. Máy ảnh và trình điều khiển phải hỗ trợ định dạng hình ảnh YV12 và NV21 để hỗ trợ xem trước hình ảnh máy ảnh trên màn hình và quay video.
Triển khai HAL (kế thừa)
HAL nằm giữa trình điều khiển máy ảnh và khung Android cấp cao hơn và xác định 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 máy ảnh. Giao diện HAL được định nghĩa 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ề máy ảnh, chẳng hạn như ID máy ảnh và các thuộc tính chung cho tất cả các máy ảnh (nghĩa là, cho dù đó là máy ảnh mặt trước hay mặt sau).
camera.h
chứa mã tương ứng với android.hardware.Camera
. Tệp tiêu đề này khai báo cấu trúc camera_device
mà lần lượt chứa cấu trúc camera_device_ops
với các con trỏ đến các hàm triển khai giao diện HAL. Để biết tài liệu về các thông 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 với hàm được trỏ tới bởi int (*set_parameters)(struct camera_device *, const char *parms)
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 được chia sẻ
Thiết lập hệ thống xây dựng Android để đóng gói chính xác việc triển khai HAL vào thư viện được chia sẻ và sao chép nó vào vị trí thích hợp bằng cách tạo tệp Android.mk
:
- Tạo thư mục
device/<company_name>/<device_name>/camera
để chứa các tệp nguồn thư viện của bạn. - Tạo tệp
Android.mk
để xây dựng thư viện được chia sẻ. Đảm bảo rằng 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 tên là
camera.<device_name>
(.so
được nối tự động) để Android có thể tải thư viện một cách chính xác. Ví dụ: hãy xem makefile cho máy ảnh 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 máy ảnh 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
với makefile của thiết bị của bạn. Ví dụ: để chỉ định thiết bị của bạn có đèn flash máy ảnh và có thể tự động lấy nét, hãy thêm các dòng sau vào<device>/<company_name>/<device_name>/device.mk
makefile: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 \
của thiết bịĐể biết ví dụ về cấu hình thiết bị, hãy xem
device/samsung/tuna/device.mk
. - Khai báo khả năng codec, định dạng và độ phân giải đa phương tiện của máy ảnh của bạn trong các tệp XML
device/<company_name>/<device_name>/media_profiles.xml
vàdevice/<company_name>/<device_name>/media_codecs.xml
. Để biết chi tiết, hãy xem Hiển thị codec cho khung . - Thêm các dòng sau vào thiết bị của bạn
device/<company_name>/<device_name>/device.mk
makefile để sao chép cácmedia_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 đó trong biến
PRODUCT_PACKAGES
trong thiết bị của bạndevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...