Camera

Biểu tượng HAL của Máy ảnh Android

Lớp trừu tượng phần cứng máy ảnh (HAL) của Android 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 cơ bản của bạn. Hệ thống con máy ảnh bao gồm các hoạt động triển khai cho các thành phần đường dẫn máy ảnh trong khi HAL của máy ảnh 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.

Ngành kiến ​​​​trúc

Hình và danh sách sau đây mô tả các thành phần HAL.

Cấu trúc máy ảnh Android

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, mã này sử dụng API Camera 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 liên kết được liên kết với CameraService tại frameworks/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 máy ảnh vật lý và trả về dữ liệu được sử dụng để tạo đối tượng CameraDevice và cuối cùng là CameraCaptureSession ở cấp khung.
khung gốc
Khung công tác này nằm trong frameworks/av/ cung cấp một lớp tương đương gốc với các lớp CameraDeviceCameraCaptureSession . 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 vượt qua ranh giới quy trình. Có một số lớp liên kết máy ảnh nằm trong thư mục frameworks/av/camera/camera/aidl/android/hardware gọi vào dịch vụ máy ảnh. ICameraService là giao diện cho dịch vụ camera; ICameraDeviceUser là giao diện cho một thiết bị camera đã mở cụ thể; và ICameraServiceListenerICameraDeviceCallbacks là các lệnh gọi lại CameraServiceCameraDevice tương ứng vớ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ụ camera gọi vào và bạn phải triển khai để phần cứng camera của mình hoạt động chính xác.

Thực hiện 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. Giao diện HIDL cho Camera HAL được xác định trong phần cứng/giao diện/máy ảnh .

Một HAL được kết dính đ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ị camera.
  • ICameraDeviceSession : Giao diện phiên thiết bị camera đang hoạt động.

Việc triển khai HIDL tham khảo có sẵn cho CameraProvider.cpp , CameraDevice.cppCameraDeviceSession.cpp . Quá trình triển khai bao gồm các HAL cũ vẫn sử dụng API cũ . 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

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ụ 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 leo thang đặc quyền hoặc truy cập vào dữ liệu mà chúng không có quyền 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 xem các giá trị độ dài bộ đệm có nằm trong phạm vi cho phép hay không và vệ sinh các tham số trước khi sử dụng và trước khi chuyển chúng tới trình điều khiển phần cứng hoặc hạt 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 cũ 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ế như được mô tả ở trên.

Kiến trúc (di sản)

Hình và danh sách sau đây mô tả các thành phần HAL của máy ảnh cũ.

Cấu trúc máy ảnh Android

Hình 2. Kiến trúc máy ảnh cũ

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. Trong nội bộ, mã này gọi 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 trong 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 vật lý và trả về dữ liệu được sử dụng để tạo đối tượng android.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 khung gốc tương đương với lớp android.hardware.Camera . Lớp này gọi proxy liên kết IPC để có quyền truy cập vào dịch vụ camera.
proxy IPC chất kết dính
Các proxy kết dính IPC tạo điều kiện thuận lợi cho việc giao tiếp vượt qua ranh giới quy trình. Có ba 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ụ camera, ICamera là giao diện cho một thiết bị camera đã mở cụ thể 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ế 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 vào và bạn phải triển khai để phần cứng camera của mì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 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 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 xác định trong các tệp tiêu đề hardware/libhardware/include/hardware/camera.hhardware/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ả 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 , lần lượt chứa cấu trúc camera_device_ops với các con trỏ tới các hàm triển khai giao diện HAL. Để biết tài liệu về các thông số máy ảnh 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 thiết lập với hàm được trỏ đến 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 .

Cấu hình thư viện 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 dùng chung và sao chép nó vào vị trí thích hợp bằng cách tạo tệp Android.mk :

  1. Tạo thư mục device/<company_name>/<device_name>/camera để chứa các tệp nguồn của thư viện của bạn.
  2. Tạo tệp Android.mk để xây dựng thư viện dùng chung. Đảm bảo rằng tệp tạo tệp 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 thư viện một cách chính xác. Để biết ví dụ, hãy xem tệp tạo tệp dành cho máy ảnh Galaxy Nexus nằm ở hardware/ti/omap4xxx/Android.mk .

  3. 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 tạo tệp của thiết bị của bạn. Ví dụ: để chỉ định thiết bị của bạn có đèn flash của máy ảnh và có thể tự động lấy nét, hãy thêm các dòng sau vào tệp tạo <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 tạo tệp thiết bị, hãy xem device/samsung/tuna/device.mk .

  4. Khai báo khả năng giải mã, định dạng và độ phân giải phương tiện của máy ảnh trong các tệp XML device/<company_name>/<device_name>/media_profiles.xmldevice/<company_name>/<device_name>/media_codecs.xml . Để biết chi tiết, hãy xem Hiển thị codec vào khung .
  5. Thêm các dòng sau vào device/<company_name>/<device_name>/device.mk trên thiết bị của bạn để sao chép các tệp media_profiles.xmlmedia_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
    
  6. Để đư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 device/<company>/<device>/device.mk của thiết bị:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...