Camera

Biểu tượng HAL camera Android

Lớp trừu tượng phần cứng (HAL) của camera trên Android kết nối các API khung camera cấp cao hơn 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 cách triển khai cho thành phần 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 bạn cho các thành phần này.

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 camera Android

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, 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 binder đượ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 vật lý và trả về dữ liệu dùng để tạo các đối tượng CameraDevice 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ớp CameraDevice CameraCaptureSession. Xem thêm tài liệu tham khảo về camera2 trong NDK.
giao diện binder IPC
Giao diện binder 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 binder 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 ICameraDeviceCallbacks là các lệnh gọi lại CameraServiceCameraDevice 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 vào 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 để ứng dụng có thể vận hành đúng phần cứng camera. Các giao diện HIDL cho HAL camera được xác định trong hardware/interfaces/camera.

HAL được binder hoá thông thường phải triển khai các giao diện HIDL sau:

Các cách triển khai HIDL tham chiếu có sẵn cho CameraProvider.cpp, CameraDevice.cpp,CameraDeviceSession.cpp. Cách triển khai này bao bọc các HAL cũ vẫn sử dụng API cũ. Kể từ Android 8.0, các cách triển khai HAL camera phải sử dụng API HIDL; không hỗ trợ việc sử dụng giao diện cũ.

Xác thực thông tin đầ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 làm sạch. Để 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à họ 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 rằng các giá trị độ dài bộ đệ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 các tham số đó đến phần cứng hoặc trình điều khiển kernel.

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. Các cách triển khai HAL camera trên Android 8.0 trở lên phải sử dụng API HIDL (được mô tả ở trên).

Kiến trúc (cũ)

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

Cấu trúc camera Android

Hình 2. Kiến trúc camera cũ

khung ứng dụng
Ở cấp khung ứng dụng là mã của ứng dụng, sử dụng android.hardware.Camera API để tương tác với phần cứng camera. Trong nội bộ, mã này gọi một lớp keo JNI tương ứng để truy cập vào mã gốc tương tác với camera.
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 camera vật lý và trả về dữ liệu 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 phiên bản gốc tương đương với android.hardware.Camera lớp. Lớp này gọi các proxy binder IPC để có quyền truy cập vào dịch vụ camera.
proxy binder IPC
Các proxy binder IPC tạo điều kiện giao tiếp qua các ranh giới quy trình. Có 3 lớp binder 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 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 vào 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 kernel
Trình điều khiển của camera tương tác với phần cứng camera thực và cách 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 để ứng dụng có thể vận hành đúng 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.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ề camera, chẳng hạn như mã camera và các thuộc tính chung cho 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 camera_device cấu trúc lần lượt chứa một camera_device_ops cấu trúc 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 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 đượ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 HAL Galaxy Nexus trong hardware/ti/omap4xxx/camera.

Định cấu hình thư viện dùng chung

Thiết lập hệ thống xây dựng Android để đóng gói đúng cách triển khai HAL vào một thư viện dùng chung và sao chép vào vị trí thích hợp bằng cách tạo tệp Android.mk:

  1. Tạo device/<company_name>/<device_name>/camera thư mục để chứa các tệp nguồn của thư việ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 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 đúng cách. Để biết ví dụ, hãy xem tệp makefile cho camera Galaxy Nexus nằm trong 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 makefile của thiết bị. Ví dụ: để chỉ định 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 của thiết bị: <device>/<company_name>/<device_name>/device.mk
    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.

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