1.2 了解各模块版本
这里我们不去考虑HAL层以下厂商他们自家的版本,从AOSP目前发布的代码来看,在上述章节的4层架构中,我们经常会提及的相机版本有以下3个方面:
1. 应用程序框架层的相机API版本(随SDK API发布)
2. 相机模块的版本(CAMERA_MODULE_API_VERSION)
3. 相机硬件抽象层接口的版本(CAMERA_DEVICE_API_VERSION)
在最新发布的Android M版本中,相机SDK的API已经支持到了v2版本,平台支持的最大相机模块版本(Module API)是2.3,支持最大的相机硬件抽象层接口的版本(Device API)是3.2。
但是往往很多厂家的手机最终支持的Module和Device版本都只到1.0版本,比如说,就目前为止我们公司出去的产品Android L版本以前的软件都是这样的,当然这很大的原因是来自于平台提供商的限制。
对于SDK API来说,这个是暴露给用户开发应用程序的接口。v2版本的Camera API是在Lollipop中新发布出来的,目前的平台包括以后很长一段时间v1和v2版本都会共存,不过在Lollipop中已经不推荐使用v1版本了(v1版本被标记deprecated),新的平台的开发将会致力于对v2版本的发展。
对于Module API来说,他指向的是相机硬件模块的版本,对应的是hw_module_t结构体中的module_api_version这个字段。Module API的规则是,如果平台报告说支持API 2.3,言下之意就是同时也支持2.3以下的所有API。
对于Device API来说,他指向的是相机硬件抽象层版本,对应的是hw_module_t结构体中的hal_api_version这个字段。他们各自的版本之间没有太多的依赖性,平台如果支持API 3.0,未必会支持API 1.0。实际情况下往往是支持了API 3.0就不会再支持其他的版本,但是也是允许支持多个版本,系统默认会选择最高的版本。
上述的Module API和Device API是Android硬件抽象层规范里面的内容,更详细的信息可以去查看“通用硬件模块”相关的内容。
1.2.1相机应用框架版本说明
目前相机应用框架版本(CameraSDK API)同时支持2个版本,新版本v2应该说是对于旧版本v1的替换,而不是他的扩展。接下来我们看一下每个版本的特点:
q Camera SDK API v1
最早版本的相机API,通过android.hardware.Camera类暴露给上层的应用开发者,而且是仅仅支持这个类。虽说这个类定义的内容比较少,但是这套API确实是一个完整的相机解决方案。他的扩展性能强,很多功能都可以通过设置参数的方式实现,只要对应的相机系统支持。目前市场上几乎所有的相机应用都用的是API v1,不过这套API在Lollipop已经过时,在未来的app开发中推荐的是API v2。
q Camera SDK API v2
通过android.hardware.camera2这个包下面的类暴露给上层的应用开发者。这个版本的API是通过Binder直接跟相机服务端通信(API 1.0版本的是通过JNI、相机客户端与服务端通信的)。这个版本可以支持更多的特性和更高的效率。
1.2.2相机硬件模块版本说明
目前相机硬件模块版本(ModuleAPI)已经升级到了2.3。他们的各个版本之间是采用向下兼容的方案,接下来我们看一下每个版本的特点:
q CAMERA_MODULE_API_VERSION_1_0
最早版本的相机API,用这个版本的硬件模块对于设设备HAL只能支持到1.0版本,同时对于应用程序框架层的相机SDK API也只能支持到v1。设备的一部分特性不能支持,比如说不能获取设备的版本,不能获取设备的静态特征等。
q CAMERA_MODULE_API_VERSION_2_0
用这个版本的硬件模块对于设设备HAL可以支持到1.0或是2.0版本,。这个版本可以支持更过的设备特征,1.0不支持的设备版本、静态特征,都支持。
q CAMERA_MODULE_API_VERSION_2_1
此版本增加了可以从HAL层异步回调到Framework层的方法,当相机状态发生改变的时候,可以通过这种方式通知到Framework层,只要实现通过set_callbacks()设置回调即可。
q CAMERA_MODULE_API_VERSION_2_2
此版本增加了静态的制造商标签,废弃了原有的,只能先通过打开相机,再查询制造商信息的这种操作方式。
q CAMERA_MODULE_API_VERSION_2_3
此版本增加了打开相机的时候可以选择使用旧版本HAL的方式。原本通过open方式打开相机返回的hw_device_t默认采用的是最新版本的HAL,通过open_legacy可以传入指定的HAL版本信息。仅在平台同时支持多个HAL版本的情况下使用有效,否则和open一致。
1.2.3相机硬件抽象层版本说明
目前相机硬件抽象层模块版本(DeviceAPI)已经升级到了3.2。他们的各个版本之间是相互独立的,接下来我们看一下每个版本的特点:
q CAMERA_DEVICE_API_VERSION_1_0
- 仅支持anroid.hardware.Camera这个类的API,即API v1。
q CAMERA_DEVICE_API_VERSION_2_0
- 支持现有android.hardware.Camera API。
- 支持相机服务层的ZSL队列。
- 未经测试的新功能,如手动捕获控制,拜耳原始数据拍摄、再处理。
q CAMERA_DEVICE_API_VERSION_3_0
- 仅ABI(应用程序二进制接口)发生变化,相对2.0,需要的硬件能力和运作模式都没发生变化。
- 重新设计了输入请求与流队列的接口。
- 重新封装请求与返回结果的结构。
- 重新封装回调的结构,重定义初始化的动作。
- 简化流管理。
- 定义硬件设备的限制模式。
q CAMERA_DEVICE_API_VERSION_3_1
- 扩展流管理,增加方法configure_streams用于重置pipeline,以及设置输入输出流。
- 增加flush方法,刷新pipeline中的请求与缓存数据,以便Framework很快的获取所有的状态。
q CAMERA_DEVICE_API_VERSION_3_2
- 废弃get_metadata_vendor_tag_ops方法,增加get_vendor_tag_ops。(这个特性是在Module API 2.2中加入的)
- 废弃register_stream_buffers,增加process_capture_request。
- 通过process_capture_result,增加分段结果返回的支持。
- 增加camera3_request_template用于控制拍照设置。
- 重构双向和输入流的规范。
- 缓冲区process_capture_result代替process_capture_request返回。