2.2Camera open在Framework中的过程

在前面的内容中,我们提到过CameraManager类的主要用途是open cam­era,这一节我们将详细梳理这一过程在Framework中的类和逻辑。

SDK提供的方法最终调用openCameraDeviceUserAsync方法,通过观察我们可以知道最核心的代码只有两行,

其中第一句获取了CameraService对象,随后调用了它的connectDevice方法,并返回了一个ICameraDeviceUser对象

我们来逐行分析:

ICameraService是一个AIDL,实现是/frameworks/av/service-s/camera/libcameraservice/CameraService.cpp,观察这个类提供的方法,可以总结为两大类:第一类链接相关的connect、disconnect、dump、block、finish等方法,第二类是设备的状态、特征、参数、监听的get、set、remove、update、add等操作方法。这些方法就代表了CameraService的主要功能是设备的链接和操作。

ICameraService的对象是通过CameraManagerGlobal类获取的,这个类是CameraManager的一个内部类,实现了单例模式,通过get方法获取实例,调用getCameraService()方法获取CameraService。在上一节中我们已经分析过CameraService的启动过程,知道系统启动后CameraService就已经启动了。这里通过“media.camera”的binder机制获取cameraService。这里完成了从应用进程到CameraService的进程通信。ICameraService是一个AIDL,它的实现在/frameworks/av/services/camera/libcameraser-vice/CameraService.cpp中,包括supportsCamera2ApiLocked方法connectDevice方法,我们稍后再讲。

在进行了Service的非空判断之后,就调用了cameraService的connectDevice方法,并返回cameraUser对象。这里我们逐一分析涉及到的每个类。

首先来看代码:

图 1 openCameraDeviceUserAsync()方法部分代码

CameraUser是一个ICameraDeviceUser的实例,我们已经讲过Framework中I开头的类一般都是AIDL机制的组成。所以在CameraService进程的一头有一个实现类BnCameraDeviceUser,被CameraDeviceClientBase继承,最终被CameraDeviceClent继承。这个类主要定义的是request和stream的操作方法。

接下来是connectDevice方法的第一个参数callback,是ICameraDeviceCallBacks类型,通过调用deviceImpl的get方法获取,查看代码可以看到这个Callback只是在ICameraDeviceCallbacks中做了创建对象的操作。这个类对应的实现是BnCameraDeviceCallbacks,被ServiceCallback继承,主要是Device的一些状态的回调。

CameraDevice类是一个抽象类,它的实现类是CameraDeviceImpl。因此这个类的行为与CameraDevice是一致的,主要是创建Session,监听状态,当然功能更多一些。我们看到openCameraDeviceUserAsync方法传入的参数实际上都用于创建deviceImpl对象。

方法的最后deviceImpl调用setRemoteDevice方法传入了cameraUser对象,在这个方法里cameraUser作为参数用于创建ICameraDeviceUserWrapper对象。这个类通过名字,我们可以知道是ICameraDeviceUser的包装类,类中的全部方法都做了异常处理的cameraUser的方法调用。

之后通过AIDL连接CameraDeviceClient,确保设备状态无异常后,异步调用CameraDevice.StateCallback的onOpened方法和继承了CameraDevice.StateCallback的静态内部抽象类StateCallbackKK的onUnconfigured方法。

这个mRemoteDevice就是应用进程与camera service之间的桥梁,通过mRemoteDevice操作service的方法,最终实现Camera底层操作。

到这里Framework的open camera操作就已经完成了,继续深入将是provider的内容,我们会在以后的章节中进行分析。在这一章节中,我们还留下了几个尾巴,例如connectDevice方法到底发生了什么,为何笔者始终没有提及getCameraCharacteristics方法。应用传入的callback到底是怎样被调用的等等,这些细节我们将在之后的内容逐一揭示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章