Camera

Biểu tượng HAL (Lớp trừu tượng phần cứng) cho 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 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.

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, 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ạo CameraDevice và cuối cùng CameraCaptureSession ở cấp khung.
khung gốc
Khung này nằm trong frameworks/av/ cung cấp gốc tương đương với CameraDevice 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 ICameraDeviceCallbacks là các biến tương ứng Các lệnh gọi lại CameraServiceCameraDevice đế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,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ũ.

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, 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ượ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 mã gốc tương đương với android.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:

  1. Tạo một device/<company_name>/<device_name>/camera để chứa 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 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 trong hardware/ti/omap4xxx/Android.mk.

  3. 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.

  4. 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.xmldevice/<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.
  5. Thêm các dòng sau vào thẻ device/<company_name>/<device_name>/device.mk tệp makefile để sao chép media_profiles.xmlmedia_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
    
  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 dữ liệu của thiết bị device/<company>/<device>/device.mk tệp makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...