和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、概览
二、Camera HIDL 接口
三 、Camera Provider 主程序
四、Camera HAL3 接口
相机硬件抽象层
一、概览
始于谷歌的Treble开源项目,基于接口与实现的分离的设计原则,谷歌加入了Camera Provider这一抽象层,该层作为一个独立进程存在于整个系统中,并且通过HIDL这一自定义语言成功地将Camera Hal Module从Camera Service中解耦出来,承担起了对Camera HAL的封装工作,纵观整个Android系统,对于Camera Provider而言,对上是通过HIDL接口负责与Camera Service的跨进程通信,对下通过标准的HAL3接口下发针对Camera的实际操作,这俨然是一个中央枢纽般的调配中心的角色,而事实上正是如此,由此看来,对Camera Provider的梳理变得尤为重要,接下来就以我个人理解出发来简单介绍下Camera Provider。
Camera Provider通过提供标准的HIDL接口给Camera Service进行调用,保持与Service的正常通信,其中谷歌将HIDL接口的定义直接暴露给平台厂商进行自定义实现,其中为了极大地减轻并降低开发者的工作量和开发难度,谷歌很好地封装了其跨进程实现细节,同样地,Camera Provider通过标准的HAL3接口,向下控制着具体的Camera HAL Module,而这个接口依然交由平台厂商负责去实现,而进程内部则通过简单的函数调用,将HIDL接口与HAL3接口完美的衔接起来,由此构成了Provider整体架构。
程序员Android转于网络图片
由图中可以看出Camera Provider进程由两部分组成,一是运行在系统中的主程序通过提供了标准的HIDL接口保持了与Camera Service的跨进程通讯,二是为了进一步扩展其功能,通过dlopen方式加载了一系列So库,而其中就包括了实现了Camera HAL3接口的So库,而HAL3接口主要定义了主要用于实现图像控制的功能,其实现主要交由平台厂商或者开发者来完成,所以Camera HAL3 So库的实现各式各样,在高通平台上,这里的实现就是我们本文重点需要分析的CamX-CHI框架。
在开始梳理CamX-CHI之前,不防先从上到下,以接口为主线简单梳理下Camera Provider的各个部分:
二、Camera HIDL 接口
首先需要明确一个概念,就是HIDL是一种自定义语言,其核心是接口的定义,而谷歌为了使开发者将注意力落在接口的定义上而不是机制的实现上,主动封装了HIDL机制的实现细节,开发者只需要通过*.hal文件定义接口,填充接口内部实际的实现即可,接下来来看下具体定义的几个主要接口:
程序员Android转于网络图片
因为HIDL机制本身是跨进程通讯的,所以Camera Service本身通过HIDL接口获取的对象都会有Bn端和Bp端,分别代表了Binder两端,接下来为了方便理解,我们都省略掉Bn/Bp说法,直接用具体接口类代表,忽略跨进程两端的区别。
ICameraProvider.hal源码如下:
package android.hardware.camera.provider@2.4;
import ICameraProviderCallback;
import android.hardware.camera.common@1.0::types;
import android.hardware.camera.device@1.0::ICameraDevice;
import android.hardware.camera.device@3.2::ICameraDevice;
interface ICameraProvider {
setCallback(ICameraProviderCallback callback) generates (Status status);
getVendorTags() generates (Status status, vec<VendorTagSection> sections);
getCameraIdList() generates (Status status, vec<string> cameraDeviceNames);
isSetTorchModeSupported() generates (Status status, bool support);
getCameraDeviceInterface_V1_x(string cameraDeviceName) generates (Status status, android.hardware.camera.device@1.0::ICameraDevice device);
getCameraDeviceInterface_V3_x(string cameraDeviceName) generates (Status status, android.hardware.camera.device@3.2::ICameraDevice device);
};
该文件中定义了ICameraProvider接口类,由CameraProvider继承并实现,在Camera Provider启动的时候被实例化,主要接口如下:
getCameraDeviceInterface_V3_x: 该方法主要用于Camera Service获取ICameraDevice,通过该对象可以控制Camera 设备的诸如配置数据流、下发request等具体行为。
setCallback:将Camera Service 实现的ICameraProviderCallback传入Camera Provider,一旦Provider有事件产生时便可以通过该对象通知Camera Service。
ICameraProviderCallback.hal源码如下:
package android.hardware.camera.provider@2.4;
import android.hardware.camera.common@1.0::types;
interface ICameraProviderCallback {
cameraDeviceStatusChange(string cameraDeviceName, CameraDeviceStatus newStatus);
torchModeStatusChange(string cameraDeviceName, TorchModeStatus newStatus);
};
该文件中定义了ICameraProviderCallback回调接口类,该接口由Camera Serv