Android camera架构

本文深入探讨了Android相机子系统的发展历程,从最初的API1和HAL1到当前的API2和HAL3,详细介绍了相机硬件抽象层如何连接相机驱动程序与高级框架API,以及相机子系统如何提供更灵活的控制和增强的性能。文章还分析了相机HAL接口在Project Treble中的作用,以及相机子系统代码路径,包括framework层、camera service、camera provider和HAL层的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android官方文档

https://source.android.google.cn/devices/camera

随着Android系统的不断升级,相机子系统框架也在不断进化,由最初的API1和HAL1到现在的API2和HAL3,由最初简单的拍照,录制到现在的连拍,AI人像;可以说是架构上变动最大最频繁的子系统。很多设备仍然依赖相机 HAL1,因此 Android 7.0 继续支持该模块。此外,Android 相机服务还支持同时实现两种 HAL(1 和 3),如果您希望通过相机 HAL1 支持性能略低的前置摄像头,并通过相机 HAL3 支持更为高级的后置摄像头。Android 的相机硬件抽象层 (HAL) 可将 Camera 2 中较高级别的相机框架 API 连接到底层的相机驱动程序和硬件。相机子系统包括相机管道组件的实现,而相机 HAL 则可提供用于实现您的这些组件版本的接口。从 Android 8.0 开始,相机 HAL 接口是 Project Treble 的一部分,相应的 HIDL 接口在硬件/接口/相机中定义。该实现会封装仍在使用旧版 API 的旧 HAL。从 Android 8.0 开始,相机 HAL 实现必须使用 HIDL API;不支持使用旧版接口。Android8.0下最新的相机架构具有更高的灵活性。架构如下:

Android 相机架构

重新设计 Android Camera API 的目的在于大幅提高应用对于 Android 设备上的相机子系统的控制能力,同时重新组织 API,提高其效率和可维护性。借助额外的控制能力,您可以更轻松地在 Android 设备上构建高品质的相机应用,这些应用可在多种产品上稳定运行,同时仍会尽可能使用设备专用算法来最大限度地提升质量和性能。版本 3 相机子系统将多个运行模式整合为一个统一的视图,您可以使用这种视图实现之前的任何模式以及一些其他模式,例如连拍模式。这样一来,便可以提高用户对聚焦、曝光以及更多后期处理(例如降噪、对比度和锐化)效果的控制能力。此外,这种简化的视图还能够使应用开发者更轻松地使用相机的各种功能。架构图已经很清晰的描述了各层架构之间的关系,我们按图索骥从最新的架构开始,再看完整的架构,最后我们回到应用层来看Camera子系统的设计。

代码路径:

(1)framework 层代码
frameworks/base/core/java/android/hardware/camera2
 
(1.5)是camera framework和Camera service之间的IPC数据通信载体 /frameworks/av/camera
也就是说这就是一个binder通信载体
 
(2)camera service
frameworks/av/services/camera/libcameraservice$
 
(3)camera provider
hardware/interfaces/camera/provider/2.4
 
(4)hal层接口
hardware/interfaces/camera/common/1.0/
hardware/interfaces/camera/device/3.2
hardware/libhardware/include/hardware/camera3.h
hardware/libhardware/modules/camera/3_0
 
(5)hal层的实现
vendor/qcom/proprietary/camx/src/core/
 
(6)算法实现
vendor/qcom/proprietary/chi-cdk/vendor/node/

camera2包架构示意图:

fig.1

这里引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata。这一切建立在一个叫作 CameraCaptureSession 的会话中。

Camera2 中主要的API类:

CameraManager类 : 摄像头管理类,站在高处统管所有摄像投设备(CameraDevice)的管理者,用于检测、打开系统摄像头,通过getCameraCharacteristics(cameraId)可以获取摄像头特征。

CameraCharacteristics类:相机特性类,是 CameraDevice 的属性描述类,例如,是否支持自动调焦,是否支持zoom,是否支持闪光灯一系列特征。

CameraDevice类: 相机设备,负责建立 CameraCaptureSession 以及建立 CaptureRequest,类似早期的camera类。

CameraCaptureSession类:用于创建预览、拍照的Session类。通过它的setRepeatingRequest()方法控制预览界面 , 通过它的capture()方法控制拍照动作或者录像动作。

CameraRequest类:一次捕获的请求,可以设置一系列的参数,用于控制预览和拍照参数,例如:对焦模式,曝光模式,zoom参数等等。
 

CameraDevice类

CameraDevice的reateCaptureRequest(int templateType)方法创建CaptureRequest.Builder。

templateType参数有以下几种:

TEMPLATE_PREVIEW :预览

TEMPLATE_RECORD:拍摄视频

TEMPLATE_STILL_CAPTURE:拍照

TEMPLATE_VIDEO_SNAPSHOT:创建视视频录制时截屏的请求

TEMPLATE_ZERO_SHUTTER_LAG:创建一个适用于零快门延迟的请求。在不影响预览帧率的情况下最大化图像质量。

TEMPLATE_MANUAL:创建一个基本捕获请求,这种请求中所有的自动控制都是禁用的(自动曝光,自动白平衡、自动焦点)。
 

HAL子系统:

请求

应用框架会针对捕获的结果向相机子系统发出请求。一个请求对应一组结果。请求包含有关捕获和处理这些结果的所有配置信息。其中包括分辨率和像素格式;手动传感器、镜头和闪光灯控件;3A 操作模式;RAW 到 YUV 处理控件;以及统计信息的生成等。这样一来,便可更好地控制结果的输出和处理。一次可发起多个请求,而且提交请求时不会出现阻塞。请求始终按照接收的顺序进行处理。

相机模型:

相机请求模型

 

### Android Camera 架构概述 在 Android 中,Camera架构被设计成多层结构来实现硬件抽象和应用接口之间的解耦合。最底层是 HAL (Hardware Abstraction Layer),它负责与具体的相机硬件交互并提供统一的服务给上层软件使用[^1]。 #### 应用框架层 对于开发者来说,接触最多的是位于最高层次的应用程序编程接口(API)——即 `android.hardware.Camera` 类及其后续版本中的相应类。此部分提供了 Java 接口供应用程序调用来操作摄像头功能。JNI 层面的具体实现在文件 `frameworks/base/core/jni/android_hardware_Camera.cpp` 中完成,该 C++ 文件包含了必要的本地方法以桥接 Java 和更低级别的系统资源管理逻辑[^2]。 #### 原生框架层 原生框架通过一系列库和服务实现了对图像捕捉流程的支持以及参数配置等功能。这部分工作由多个模块共同协作完成,其中包括但不限于: - **Media Server**: 负责处理多媒体流,并协调不同组件间的工作。 - **Camera Service**: 提供给其他服务使用的公共 API 来控制相机设备;同时作为客户端向 HAL 发送请求。 #### 硬件抽象层(HAL) HAL 是连接驱动程序和其他更高层次软件的关键环节。制造商可以根据自己产品的特点开发特定于平台的实现方式,而不需要修改整个操作系统源码。这不仅提高了系统的灵活性也增强了安全性[^3]。 ```cpp // 示例:JNI 方法声明,在 android_hardware_Camera.cpp 中定义 extern "C" JNIEXPORT void JNICALL Java_android_hardware_Camera_native_setup(JNIEnv* env, jobject thiz); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值