Lớp trừu tượng phần cứng máy ảnh (HAL) của Android kết nối lớp cấp cao hơn API khung máy ảnh trong Camera 2 sang trình điều khiển và phần cứng máy ảnh cơ bản. Hệ thống con máy ảnh bao gồm phương thức triển khai cho các thành phần đường ống của camera trong khi lớp trừu tượng phần cứng (HAL) cho camera cung cấp giao diện để sử dụng trong việc triển khai phiên bản của thành phần.
Kiến trúc
Hình và danh sách dưới đây mô tả các thành phần HAL.
- khung ứng dụng
- Ở cấp khung ứng dụng là mã của ứng dụng, mã này sử dụng Camera 2 API để tương tác với phần cứng máy ảnh. Mã này trong nội bộ các lệnh gọi tương ứng Giao diện Binder để truy cập vào mã gốc tương tác với máy ảnh.
- AIDL
- Giao diện liên kết liên kết với
CameraService
có thể là đã tìm thấy tại Frameworks/av/camera/aidl/android/hardware. Mã được tạo 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ạoCameraDevice
và cuối cùngCameraCaptureSession
ở cấp khung. - khung gốc
- Khung này nằm trong
frameworks/av/
cung cấp gốc tương đương vớiCameraDevice
vàCameraCaptureSession
khác. 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ợ việc giao tiếp qua ranh giới của quy trình.
Có một số lớp liên kết camera trong
Thư mục
frameworks/av/camera/camera/aidl/android/hardware
cuộc gọi đến dịch vụ camera.ICameraService
là giao diện dẫn đến dịch vụ máy ảnh;ICameraDeviceUser
là giao diện để truy cập vào một thiết bị camera; vàICameraServiceListener
vàICameraDeviceCallbacks
là các biến tương ứng Các lệnh gọi lạiCameraService
vàCameraDevice
đến hàm khung ứng dụng. - dịch vụ camera
- Dịch vụ máy ảnh, ở
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 chuẩn mà các lệnh gọi dịch vụ máy ảnh vào và bạn phải triển khai để có máy ảnh hoạt động chính xác của phần cứng.
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 để ứng dụng có thể hoạt động chính xác phần cứng máy ảnh. HIDL giao diện cho HAL (Lớp trừu tượng phần cứng) cho máy ảnh được định nghĩa trong phần cứng/giao diện/camera.
Một HAL liên kết thông thường phải triển khai các giao diện HIDL sau đây:
-
ICameraProvider
: Để liệt kê các thiết bị riêng lẻ và quản lý trạng thái của các thiết bị đó. -
ICameraDevice
: Giao diện thiết bị máy ảnh. -
ICameraDeviceSession
: Giao diện phiên trên thiết bị máy ảnh đang hoạt động.
Hiện đã có phương thức triển khai HIDL tham chiếu cho
CameraProvider.cpp
!
CameraDevice.cpp
, và
CameraDeviceSession.cpp
.
Quá trình triển khai bao bọc các lớp trừu tượng phần cứng cũ vẫn sử dụng
API cũ.
Kể từ Android 8.0, việc triển khai lớp trừu tượng phần cứng (HAL) cho máy ảnh phải sử dụng HIDL API; sử dụng
của giao diện cũ không được hỗ trợ.
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ụ máy ảnh, nên ranh giới giữa cả hai đều đượ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 sẽ bị 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 khiến kẻ tấn công đặc quyền chuyển lên cấp trên hoặc truy cập dữ liệu mà họ không có quyền truy cập, thì lớp trừu tượng phần cứng (HAL) của camera phải xác thực các tham số được truyền từ dịch vụ máy ảnh đến HAL. Điều này bao gồm việc kiểm tra vùng đệm các giá trị độ dài 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 mã đến trình điều khiển phần cứng hoặc nhân hệ điều hành.
Thành phần HAL cũ
Phần này mô tả kiến trúc của các thành phần HAL cũ và cách triển khai HAL. Việc triển khai lớp trừu tượng phần cứng (HAL) cho máy ảnh trên Android 8.0 trở lên phải sử dụng HIDL API, được mô tả ở trên.
Cấu trúc (cũ)
Hình và danh sách sau đây mô tả các thành phần HAL (Lớp trừu tượng phần cứng) cho máy ảnh cũ.
- khung ứng dụng
- Ở cấp khung ứng dụng là mã của ứng dụng, mã này sử dụng
android.hardware.Camera
API để tương tác với phần cứng máy ảnh. Trong nội bộ, mã này gọi lớp keo JNI tương ứng để truy cập vào mã gốc tương tác với máy ảnh. - JNI
- Mã JNI liên kết với
android.hardware.Camera
nằm ởframeworks/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 máy ảnh 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 mã gốc tương đương vớiandroid.hardware.Camera
. Lớp này gọi IPC các proxy liên kết để truy cập vào dịch vụ máy ảnh. - proxy IPC liên kết
- Các proxy liên kết IPC hỗ trợ hoạt động giao tiếp vượt qua ranh giới của 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ụ máy ảnh.ICameraService
là giao diện cho dịch vụ máy ảnh,ICamera
là giao diện dẫn đến 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ụ máy ảnh, ở
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 chuẩn mà các lệnh gọi dịch vụ máy ảnh vào và bạn phải triển khai để có máy ảnh hoạt động chính xác của phần cứng.
- trình điều khiển 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à triển khai HAL. Camera và trình điều khiển phải hỗ trợ YV12 và NV21 để hỗ trợ xem trước hình ảnh từ máy ảnh trên màn hình và video.
Triển khai HAL (cũ)
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 để ứng dụng có thể hoạt động chính xác
phần cứng máy ảnh. Giao diện HAL được xác định trong
hardware/libhardware/include/hardware/camera.h
và
Tệp tiêu đề hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
định nghĩa camera_module
, một tiêu chuẩn
cấu trúc máy ảnh để lấy thông tin chung về máy ảnh, chẳng hạn như mã nhận dạng của máy ảnh
và thuộc tính chung cho tất cả các máy ảnh (tức là, cho dù đó là máy ảnh trước hay
camera 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
lần lượt 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. Để xem tài liệu về các tham số của máy ảnh, nhà phát triển có thể
đặt, 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)
trỏ đến trong HAL.
Để xem ví dụ về cách triển khai HAL (Lớp trừu tượng phần cứng), hãy tham khảo cách triển khai
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 triển khai HAL (Lớp trừu tượng phần cứng) một cách chính xác
vào thư viện dùng chung rồi sao chép thư viện đó vào vị trí thích hợp bằng cách tạo một
Tệp Android.mk
:
- Tạo một
device/<company_name>/<device_name>/camera
để chứa tệp nguồn của thư viện. - Tạo tệp
Android.mk
để xây dựng 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 tên là
camera.<device_name>
(.so
được thêm tự động), để Android có thể tải chính xác thư viện của bạn. Để biết ví dụ, hãy xem tệp makefile cho máy ảnh Galaxy Nexus nằm tronghardware/ti/omap4xxx/Android.mk
. - Hãy chỉ định rằng thiết bị của bạn có các tính năng của máy ảnh bằng cách sao chép XML của 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 máy ảnh và có thể tự động lấy nét, thêm các dòng sau vào<device>/<company_name>/<device_name>/device.mk
tệp 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 \
Để biết ví dụ về tệp makefile của thiết bị, hãy xem
device/samsung/tuna/device.mk
. - Khai báo bộ mã hoá và giải mã nội dung đa phương tiện, khả năng định dạng và độ phân giải của camera trong
device/<company_name>/<device_name>/media_profiles.xml
vàdevice/<company_name>/<device_name>/media_codecs.xml
Tệp XML. Để biết thông tin chi tiết, hãy xem Hiển thị bộ mã hoá và giải mã đối với khung. - Thêm các dòng sau vào thẻ
device/<company_name>/<device_name>/device.mk
tệp makefile để sao chépmedia_profiles.xml
vàmedia_codecs.xml
tệp 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 dữ liệu của thiết bịdevice/<company>/<device>/device.mk
tệp makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...