本页详细介绍了 Camera HAL、API 和相关的 Android 兼容性测试套件 (CTS) 测试中的版本差异,还介绍了在 Android 7.0 中为增强和提高相机框架安全性而进行的几项架构更改,在 Android 8.0 中引入 Treble,以及供应商在其相机实现中为支持这些更改而必须进行的更新。
本页中用到以下术语:
Camera API1
Android 4.4 或更低版本设备上的应用级摄像头框架,通过 android.hardware.Camera
类提供。
Camera API2
Android 5.0 及更高版本设备上的应用级相机框架,通过 android.hardware.camera2
包提供。
Camera HAL
由 SoC 供应商实现的相机模块层。该应用级公共框架基于 Camera HAL 构建而成。
Camera HAL3.1
随 Android 4.4 发布的相机设备 HAL 版本。
Camera HAL3.2
随 Android 5.0 发布的相机设备 HAL 版本。
Camera API1 CTS
在 Camera API1 之上运行的相机兼容性测试套件 (CTS) 测试集。
Camera API2 CTS
在 Camera API2 之上运行的另一个相机 CTS 测试集。
Treble
利用新的供应商接口,将供应商实现(由芯片制造商编写的设备专属底层软件)与 Android 操作系统框架分离开来。
HIDL
HAL 接口定义语言随 Treble 引入,用于指定 HAL 和其用户之间的接口。
VTS
供应商测试套件随 Treble 引入。
Android 包含以下相机 API。
Android 5.0 已弃用 Camera API1,而且随着新平台开发的重点放在 Camera API2 上,Camera API1 会逐渐被淘汰。但是,淘汰期限将会很长,而且在一段时间内新 Android 版本会继续支持 Camera API1 应用。具体来说,将继续为以下内容提供支持:
Camera API2 框架为应用提供更接近底层的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。有关详细信息,请观看 Google I/O 视频概览。
Android 5.0 及更高版本提供 Camera API2;但是,运行 Android 5.0 及更高版本的设备可能并不支持所有 Camera API2 功能。应用可通过 Camera API2 接口查询 android.info.supportedHardwareLevel
属性。该属性会报告以下支持级别之一:
LEGACY
(旧版)。这些设备通过 Camera API2 接口为应用提供功能,而且这些功能与通过 Camera API1 接口提供给应用的功能大致相同。旧版框架代码在概念上将 Camera API2 调用转换为 Camera API1 调用;旧版设备不支持 Camera API2 功能,例如每帧控件。LIMITED
(有限)。这些设备支持部分(但不是全部)Camera API2 功能,并且必须使用 Camera HAL 3.2 或更高版本。FULL
(全面)。这些设备支持 Camera API2 的所有主要功能,并且必须使用 Camera HAL 3.2 或更高版本以及 Android 5.0 或更高版本。LEVEL_3
(级别 3):这些设备支持 YUV 重新处理和 RAW 图片捕获,以及其他输出流配置。EXTERNAL
(外部):这些设备类似于 LIMITED
设备,但有一些例外情况;例如,某些传感器或镜头信息可能未被报告或具有较不稳定的帧速率。此级别用于外部相机(如 USB 网络摄像头)。各项功能通过 Camera API2 接口中的 android.request.availableCapabilities
属性提供。FULL
设备需要具备 MANUAL_SENSOR
和 MANUAL_POST_PROCESSING
等功能。但即使是 FULL
设备,也并非必须实现 RAW
功能。LIMITED
设备可以提供这些功能的任何子集,甚至可以不提供其中任何功能。但是,必须始终定义 BACKWARD_COMPATIBLE
功能。
设备支持的硬件级别及其支持的特定 Camera API2 功能采用以下功能标记的形式指明,以允许 Google Play 过滤 Camera API2 相机应用。
android.hardware.camera.hardware_level.full
android.hardware.camera.capability.raw
android.hardware.camera.capability.manual_sensor
android.hardware.camera.capability.manual_post_processing
运行 Android 5.0 及更高版本的设备必须通过 Camera API1 CTS、Camera API2 CTS 和 CTS 验证程序相机测试。
不具备 Camera HAL3.2 实现且不能支持完整的 Camera API2 接口的设备仍必须通过 Camera API2 CTS 测试。但是,该设备将在 Camera API2 LEGACY
模式下运行(在该模式下,Camera API2 调用在概念上映射到 Camera API1 调用),因此与 Camera API1 之上的特征或功能相关的任何 Camera API2 CTS 测试都将自动跳过。
在旧版设备上,未跳过的 Camera API2 CTS 测试使用现有的公共 Camera API1 接口和功能,没有新的要求。显示的错误(并导致 Camera API2 CTS 失败)是设备现有 Camera HAL 中已经存在的错误,因此可由现有 Camera API1 应用找到。我们预计不会出现太多此类错误(但是,任何此类错误均必须修复,才能通过 Camera API2 CTS 测试)。
采用绑定式 HAL 实现的运行 Android 8.0 及更高版本的设备必须通过相机 VTS 测试。
为了增强媒体和相机框架安全性,Android 7.0 已将相机服务从 mediaserver 中移出。从 Android 8.0 开始,每个绑定式相机 HAL 都会在与相机服务不同的进程中运行。供应商可能需要根据正在使用的 API 和 HAL 版本对 Camera HAL 进行更改。以下部分详细介绍了在 HAL1 和 HAL3 的 AP1 和 AP2 中进行的架构更改,以及常规要求。
API1 视频录制可能会假定相机和视频编码器存在于同一进程中。在以下对象上使用 API1 时:
图 1. HAL3 上 API1 中的 Android 7.0 相机和媒体堆栈。
kMetadataBufferTypeCameraSource
)。 图 2. HAL1 上 API1 中的 Android 7.0 相机和媒体堆栈。
对于 HAL1 或 HAL3 上的 API2,BufferQueue 会传递缓冲区,以便这些路径能继续工作。Android 7.0 的 API2 架构:
图 3. HAL3 上 API2 中的 Android 7.0 相机和媒体堆栈。
为增强媒体和相机框架安全性而进行的架构更改包括以下附加设备要求。
android.hardware.camera2.cts.PerformanceTest
和 Google 摄像头应用,以进行 120/240 FPS 高速视频录制,从而衡量实际影响。设备还需要少量额外的 RAM 来创建新进程。kMetadataBufferTypeNativeHandleSource
作为元数据缓冲区类型,并在视频缓冲区中传递 VideoNativeHandleMetadata
(kMetadataBufferTypeCameraSource
在 Android 7.0 中不再受支持)。通过 VideoNativeHandleMetadata
,相机和媒体框架能够正确地对原生句柄进行序列化和反序列化,从而在进程之间传递视频缓冲区。对于包含相机且运行 Android 7.0 的所有设备,请通过运行 Android 7.0 CTS 来验证相关实现。尽管 Android 7.0 不包含验证相机服务更改的新 CTS 测试,但如果您尚未进行上述更新,则现有 CTS 测试将失败。
对于包含相机并运行 Android 8.0 或更高版本的所有设备,请通过运行 VTS 来验证供应商实现。
要获取可用于评估 Android Camera HAL 的测试列表,请参阅 Camera HAL 测试核对清单。
Android 8.0 版本引入了 Treble。引入 Treble 后,供应商相机 HAL 实现必须为绑定式。Android 8.0 还包含对相机服务的以下主要增强功能:
OutputConfiguration
onCaptureQueueEmpty
有关这些功能的详细信息,请参阅以下部分。
共享 surface
借助此功能,只需一组缓冲区就可以驱动两个输出(例如预览和视频编码),从而降低功耗和内存消耗。要支持此功能,设备制造商需要确保其相机 HAL 和 gralloc HAL 实现可以创建将由多个不同消耗方(而不是仅一个消耗方;例如 Hardware Composer/GPU 和视频编码器)使用的 gralloc 缓冲区。相机服务会将消耗方使用情况标记传递到相机 HAL 和 gralloc HAL;它们需要分配正确的缓冲区类型,或者相机 HAL 需要返回一个表明该消耗方组合不受支持的错误。
有关其他详细信息,请参阅 enableSurfaceSharing
开发者文档。
适用于自定义相机模式的系统 API
公共相机 API 定义了两种操作模式:正常模式和受限高速录制模式。这两种模式的语义截然不同;高速模式受限于一次最多只能有两个具体输出等。各个原始设备制造商 (OEM) 已表现出极大的兴趣想要针对特定于硬件的功能定义其他自定义模式。说白了,该模式只是一个传递到 configure_streams
的整数。请参阅 hardware/camera/device/3.2/ICameraDeviceSession#configurestreams
。
此功能包括一个系统 API 调用,OEM 摄像头应用可以使用该调用来启用自定义模式。这些自定义模式必须以整数值 0x8000 开头,以避免与未来添加到公共 API 的模式发生冲突。
要支持这一功能,OEM 只需将新模式添加到其 HAL 即可,传递至 HAL 的这一整数会在 configure_streams 上触发该模式,然后 OEM 就可以让其自定义相机应用使用系统 API。
方法名称是 android.hardware.camera2.CameraDevice#createCustomCaptureSession
。 请参阅:frameworks/base/core/java/android/hardware/camera2/CameraDevice.java#805
。
注意:在 Android 8.1 版本中,应用必须预安装到系统映像上,才能访问此 API。
onCaptureQueueEmpty
此 API 的目的是通过尽可能让请求队列为空,来缩短控制更改(如缩放)的延迟时间。onCaptureQueueEmpty
不需要 HAL 发挥作用;它只是一种框架端补充。想要利用此 API 的应用需要向该回调添加监听器,并相应地做出响应。通常,响应方式是向相机设备发送另一个捕获请求。
相机 HIDL 接口
相机 HIDL 接口在相机 HAL 接口(使用以 HIDL 定义的稳定 API)基础上进行了全面改造。在最近的旧版本 3.4 和 2.4(针对相机模块)中引入的所有功能和相机功能也是 HIDL 定义的一部分。
对受支持的元数据添加了少许内容并对 data_space 支持进行了更改:
RAW_OPAQUE
格式,则必须强制添加 ANDROID_SENSOR_OPAQUE_RAW_SIZE
静态元数据。ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE
静态元数据。camera3_stream_t data_space
字段切换为更灵活的定义。ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE
ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL
ANDROID_SENSOR_DYNAMIC_WHITE_LEVEL
ANDROID_SENSOR_OPAQUE_RAW_SIZE
ANDROID_SENSOR_OPTICAL_BLACK_REGIONS
扩展功能 HAL 的小修订:
camera3_stream_t
添加了 data_space
字段。camera3_stream_t
添加了旋转字段。camera3_stream_configuration_t
添加了 camera3 流配置操作模式。扩展功能 HAL 的小修订:
get_metadata_vendor_tag_ops
。在 camera_common.h
中改用 get_vendor_tag_ops
。register_stream_buffers
。框架在 process_capture_request
中提供给 HAL 的所有 gralloc 缓冲区在任何时候可能都是新的。process_capture_result
可以获得可用结果的子集。camera3_request_template
添加了手动模板。应用可以使用此模板直接控制捕获设置。process_capture_result
而不是 process_capture_request
中返回。扩展功能 HAL 的小修订:
configure_streams
将消耗方使用标记传递给 HAL。扩展功能 HAL 的首次修订:
initialize()
调用中。初始版本的扩展功能 HAL (Android 4.2) [camera2.h]:
android.hardware.Camera
API。初始 Android Camera HAL (Android 4.0) [camera.h]:
android.hardware.Camera
API。本部分包含相机硬件模块的模块版本控制信息(基于 camera_module_t.common.module_api_version
)。两个最重要的十六进制数字表示 Major 版本,而两个最不重要的数字表示 Minor 版本。
此相机模块版本添加了以下 API 更改:
open()
以打开相机设备),Camera HAL 模块必须通过手电筒模式状态回调告知框架手电筒模式已关闭。CAMERA_DEVICE_STATUS_PRESENT
时,获取静态信息的调用将为无效调用。框架仅依赖设备状态更改回调来管理可用的外部相机列表。get_camera_info
调用返回的 camera_info
结构中设置 resource_cost
和 conflicting_devices
字段。该相机模块版本添加了对打开旧版 Camera HAL 设备的支持。如果同一设备可以支持多个设备 API 版本,则框架利用该支持可以打开相机设备作为较低设备 HAL 版本的 HAL 设备。标准硬件模块打开调用 (common.methods->open) 会继续使用支持的最新版本(即 camera_info_t.device_version
中列出的版本)打开相机设备。
该相机模块版本添加了模块供应商标记支持,并且弃用了以前只能通过打开设备才可访问的旧版 vendor_tag_query_ops
。
该相机模块版本添加了对从 Camera HAL 模块到框架的异步回调支持,利用该支持可以通知框架关于相机模块状态的更改。提供有效 set_callbacks()
方法的模块必须至少报告此版本号。
报告此版本号的相机模块会实现相机模块 HAL 接口的第二个版本。可通过此模块打开的相机设备可能支持 1.0 版本或 2.0 版本的相机设备 HAL 接口。camera_info 的 device_version
字段始终有效;如果 device_version
字段为 2.0 或更高版本,则 camera_info
的 static_camera_characteristics
字段有效。
报告这些版本号的相机模块实现了初始相机模块 HAL 接口。可通过此模块打开的所有相机设备仅支持版本 1 的相机设备 HAL。camera_info
的 device_version
和 static_camera_characteristics
字段无效。只有 android.hardware.Camera
API 可以受该模块及其设备的支持。