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 Camera 2 với 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 các phương thức triển khai cho các thành phần quy trình máy ảnh, trong khi HAL 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.

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 máy ảnh

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 máy ảnh. 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 máy ảnh.
AIDL
Bạn có thể tìm thấy giao diện liên kết 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 máy ảnh thực và trả về dữ liệu dùng để tạo đối tượng CameraDevice và cuối cùng là các đối tượng CameraCaptureSession ở cấp khung.
khung gốc
Khung này nằm trong frameworks/av/ cung cấp một lớp 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 NDK.
giao diện IPC của 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 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ụ máy ảnh; ICameraDeviceUser là giao diện cho một thiết bị máy ảnh đã mở cụ thể; và ICameraServiceListener ICameraDeviceCallbacks là các lệnh gọi lại CameraServiceCameraDevice tương ứng cho khung ứng dụng.
bảo dưỡng máy ảnh
Dịch vụ máy ảnh 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, đồng thời 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 HAL máy ảnh được xác định trong hardware/interfaces/camera.

Một HAL liên kết thông thường phải triển khai các giao diện HIDL sau:

Các phương thức triển khai HIDL tham chiếu 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ũ. Kể từ Android 8.0, các hoạt động triển khai HAL máy ảnh 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ụ máy ảnh, nên ranh giới giữa hai thành phầ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 các lỗ hổng bảo mật cho phép kẻ tấn công nâng cấp đặc quyền hoặc truy cập vào dữ liệu mà họ không có ý định truy cập, HAL máy ảnh 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 để đảm bảo rằng các giá trị chiều dài vùng đệm nằm trong phạm vi cho phép và dọn dẹp các tham số trước khi sử dụng và trước khi truyền các tham số đó đến trình điều khiển phần cứng hoặc nhân.

Các 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 hoạt động triển khai HAL máy ảnh trên Android 8.0 trở lên phải sử dụng API HIDL như mô tả ở trên.

Cấu trúc (cũ)

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

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

Hình 2. Cấu 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 một 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 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 thực 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 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ụ máy ảnh.
proxy IPC của liên kết
Trình liên kết proxy IPC hỗ trợ giao tiếp qua các ranh giới quy trình. Có ba lớp liên kết máy ảnh nằm trong thư mục frameworks/av/camera gọi đến dịch vụ máy ảnh. 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 đã mở cụ thể và ICameraClient là giao diện của thiết bị quay lại khung ứng dụng.
bảo dưỡng máy ảnh
Dịch vụ máy ảnh 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 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à cách triển khai HAL của bạn. Máy ảnh 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 máy ảnh 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, đồng thời 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ư mã máy ảnh và các thuộc tính phổ biến cho tất cả máy ảnh (tức là liệu đó có phải 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 một cấu trúc camera_device, theo đó chứa một cấu trúc camera_device_ops với 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ố 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 đặt bằng hàm do int (*set_parameters)(struct camera_device *, const char *parms) trỏ đế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 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 quá trình 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:

  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.
  2. 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 được thêm vào tự động) để 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 máy ảnh 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 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 bằng tệp makefile của thiết bị. 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 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.

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