旧版本相机系统
通常说的旧版本相机系统指的是Android5.0版本发布之前(即Android 4.4W Kitkat,API等级20)的AOSP源码中的相机系统。由于在这个版本之前的硬件模块和抽象层也已经存在多个版本,因此,更确切的说(至少本书中指的)旧版本的相机系统是使用应用程序框架版本为V1,硬件模块版本是1.0,硬件抽象层版本是1.0的相机系统。而且根据目前主流的平台提供商发布的平台所能支持的旧相机版本也是这样的一种状况。
接下来看一下旧相机系统的通用的框架图,如下图1-4:
对应于1.1节讲述的相机系统的4层架构,图1-4中的左侧(ApplicationFramework、JNI和Native Framework)是属于应用程序框架层;图中的中间部分(Binder IP Proxies)是属于Binder 进程间通信模块层;右侧最上边部分(Media Server)则是相机服务端模块;图中右侧中间部分(HAL)属于硬件接口访问模块与硬件抽象层,不过这类包含了HAL的实现。最后剩下的Kernel不是这卷所讲的内容,这层是Linux相机驱动程序层。
这是旧的方式对相机系统框架的实现,不难看出,在旧的相机系统中,Binder进程间通信是通过Native层的代码实现的。Application Framework和Native Framework共同组成了相机应用程序框架层的客户端,JNI仅仅是连接两者的桥梁而已。从AOSP发布的源码来看,相机的客户端层真正的实现是在Native Framework,因为在这里,Native Framework提供了等价于Application Framework的对相机设备访问的接口,因此可以说,在旧的相机系统中给,Java层的API仅仅只是Native层的API映射到Java层,方便与应用程序开发而已,在Application Framework没有太多的对相机设备控制的逻辑。
从图1-4中,在细分相机系统层次的话,可以划分成6个层次,分别是下面的:
1. 应用程序框架层(Java部分):通过android.hardware.Camera API提供给应用层编程的接口,在内部通过调用对应的JNI实现对摄像头设备的访问。
2. 应用程序框架层(JNI部分):连接Java和Native的粘合剂,Java层通过JNI访问到了摄像头设备,数据通过JNI传递到Java层。
3. 相机本地客户端(Native Framework):定义了Camera.cpp的类,这个类等效于Java层的android.hardware.Camera。在这里调用Binder进程间通信访问相机服务。
4. Binder进程间通信模块:用于进程间的通讯,定义了3个通讯接口。ICameraService用于调用相机服务的接口,ICamera用于操作指定的摄像头设备,ICameraClient是用于服务端回调到客户端的接口。
5. 相机服务端模块:相机服务,代码位于libcameraservice/CameraService.cpp,是直接与HAL层交互的代码。
6. 硬件抽象层(HAL):定义了用于被相机服务调用的标准接口,厂商必须根据这些接口正确的实现对应的相机功能。