Android Camera HAL开发概述

本文介绍Android Camera HAL开发概述部分,文章整理并翻译自:https://source.android.google.cn/devices/camera

Android 的Camera硬件抽象层 (HAL) 可将 Camera2 中较高层级的Camera框架 API 连接到底层的Camera驱动程序和硬件。Camera子系统包括Camera管道组件的实现,而Camera HAL 可提供用于实现您的这些组件版本的接口。

如果您要在搭载 Android 8.0 及更高版本的设备上实现Camera HAL,则必须使用 HIDL 接口。

更多资源:

资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera <br/>星球ID: 17296815
Wechat 极客笔记圈

Camera 架构

下列图表和列表说明了 Camera HAL 组件。

Android Camera架构

Camera应用框架

Camera应用代码位于应用框架级别,它使用 Camera2 API 与Camera硬件进行互动。在内部,此代码会调用相应的 Binder 接口,以访问与Camera互动的原生代码。

Camera AIDL

CameraService 关联的 binder 接口可在 frameworks/av/camera/aidl/android/hardware 中找到。生成的代码会调用较低级别的原生代码以获取对实体Camera的访问权限,并返回用于在框架级别创建 CameraDevice 并最终创建 CameraCaptureSession 对象的数据。

Camera Native 框架

此框架位于 frameworks/av/ 中,并提供相当于 CameraDeviceCameraCaptureSession 类的原生类。另请参阅 NDK camera2 参考

Camera binder IPC 接口

IPC binder 接口用于实现跨越进程边界的通信。调用相机服务的若干个相机 binder 类位于 frameworks/av/camera/camera/aidl/android/hardware 目录中。

  • ICameraService 是相机服务的接口;
  • ICameraDeviceUser 是已打开的特定相机设备的接口;
  • ICameraServiceListenerICameraDeviceCallbacks 分别是对应用框架的 CameraServiceCameraDevice 回调。

CameraService

位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp 下的相机服务是与 HAL 进行互动的实际代码。

Camera HAL

硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。

实现Camera HAL

HAL 位于相机驱动程序和更高级别的 Android 框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。相机 HAL 的 HIDL 接口在 hardware/interfaces/camera 中定义。

典型的绑定式 HAL 必须实现以下 HIDL 接口:

  • ICameraProvider:用于枚举单个设备并管理其状态。
  • ICameraDevice:相机设备接口。
  • ICameraDeviceSession:活跃的相机设备会话接口。

参考 HIDL 实现适用于 CameraProvider.cppCameraDevice.cppCameraDeviceSession.cpp。该实现封装了仍在使用旧版 API 的旧 HAL。从 Android 8.0 开始,相机 HAL 实现必须使用 HIDL API;不支持使用旧版接口。

旧版Camera HAL 组件

此部分介绍了旧版 HAL 组件的架构以及如何实现 HAL。搭载 Android 8.0 或更高版本的设备上的相机 HAL 实现必须改用 HIDL API(如上所述)。

Camera 架构(旧版)

下列图表和列表说明了旧版相机 HAL 组件。

Android Camera 架构(旧版)

Camera 应用框架

应用代码位于应用框架级别,它使用 android.hardware.Camera API 与相机硬件进行互动。在内部,此代码会调用相应的 JNI 粘合类,以访问与相机互动的原生代码。

Camera JNI

android.hardware.Camera 相关联的 JNI 代码位于 frameworks/base/core/jni/android_hardware_Camera.cpp 中。此代码会调用较低级别的原生代码以获取对实体相机的访问权限,并返回用于在框架级别创建 android.hardware.Camera 对象的数据。

Camera Native框架

frameworks/av/camera/Camera.cpp 中定义的原生框架可提供相当于 android.hardware.Camera 类的原生类。此类会调用 IPC binder 代理,以获取对相机服务的访问权限。

Camera binder IPC 代理

IPC binder 代理用于促进跨越进程边界的通信。调用相机服务的 3 个相机 binder 类位于 frameworks/av/camera 目录中。ICameraService 是相机服务的接口,ICamera 是已打开的特定相机设备的接口,ICameraClient 是返回到应用框架的设备接口。

CameraService

位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp 下的相机服务是与 HAL 进行互动的实际代码。

Camera HAL

硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。

内核驱动程序

相机的驱动程序可与实际相机硬件以及您的 HAL 实现进行互动。相机和驱动程序必须支持 YV12 和 NV21 图像格式,以便在显示和视频录制时支持预览相机图像。

实现 Camera HAL(旧版)

HAL 位于相机驱动程序和更高级别的 Android 框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。HAL 接口在 hardware/libhardware/include/hardware/camera.hhardware/libhardware/include/hardware/camera_common.h 头文件中定义。

camera_common.h 定义 camera_module,这是一个标准结构,可用于获取有关相机的一般信息,例如相机 ID 和所有相机通用的属性(例如,相机是前置还是后置)。

camera.h 包含与 android.hardware.Camera 对应的代码。此头文件会声明一个 camera_device 结构,该结构又反过来包含一个带函数指针(可实现 HAL 接口)的 camera_device_ops 结构。如需查看有关开发者可以设置的相机参数的文档,请参阅 frameworks/av/include/camera/CameraParameters.h。通过 HAL 中的 int (*set_parameters)(struct camera_device *, const char *parms) 来设置这些参数以及指向的函数。

如需查看 HAL 实现的示例,请参阅 hardware/ti/omap4xxx/camera 中的 Galaxy Nexus HAL 实现。

配置共享库

设置 Android 构建系统,以将 HAL 实现正确打包到共享库中,并通过创建 Android.mk 文件将其复制到相应位置:

  1. 创建一个 device/<company_name>/<device_name>/camera 目录以包含您的库的源文件。

  2. 创建一个 Android.mk 文件以构建共享库。确保 makefile 包含以下行:

    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    您的库必须命名为 camera.<device_name>(自动附加 .so),以便 Android 可以正确加载库。如需查看示例,请参阅 hardware/ti/omap4xxx/Android.mk 中的 Galaxy Nexus 相机的 makefile。

  3. 使用设备的 makefile 复制 frameworks/native/data/etc目录中的必要功能 XML 文件,以指定设备具有相机功能。例如,如需指定设备具有相机闪光灯并可自动对焦,请在设备的 <device>/<company_name>/<device_name>/device.mkmakefile 中添加以下行:

    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 \
    

    如需查看设备 makefile 的示例,请参阅 device/samsung/tuna/device.mk

  4. device/<company_name>/<device_name>/media_profiles.xmldevice/<company_name>/<device_name>/media_codecs.xml XML 文件中声明相机的媒体编解码器、格式和分辨率功能。

  5. 在设备的 device/<company_name>/<device_name>/device.mkmakefile 中添加以下行,以将 media_profiles.xmlmedia_codecs.xml文件复制到相应位置:

    # 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. 如需将相机应用包含在设备的系统映像中,请在设备的 device/<company>/<device>/device.mk makefile 的 PRODUCT_PACKAGES 变量中指定相机应用:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...
    

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Android Camera HAL开发