深⼊理解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整体架构。
image
由图中可以看出Camera Provider进程由两部分组成,⼀是运⾏在系统中的主程序通过提供了标准的HIDL接⼝保持了与Camera Service的跨进程通讯,⼆是为了进⼀步扩展其功能,通过dlopen⽅式加载了⼀系列So库,⽽其中就包括了实现了Camera HAL3接⼝的So库,⽽HAL3接⼝主要定义了主要⽤于实现图像控制的功能,其实现主要交由平台⼚商或者开发者来完成,所以Camera HAL3 So库的实现各式各样,在⾼通平台上,这⾥的实现就是我们本⽂重点需要分析的CamX-CHI框架。
在开始梳理CamX-CHI之前,不防先从上到下,以接⼝为主线简单梳理下Camera Provider的各个部分:
⼆、Camera HIDL 接⼝
⾸先需要明确⼀个概念,就是HIDL是⼀种⾃定义语⾔,其核⼼是接⼝的定义,⽽⾕歌为了使开发者将注意⼒落在接⼝的定义上⽽不是机制的实现夏家店
生日祝福语大全
蛤蟆
武功郎在这⾥插⼊图⽚描述
接下来以上图为例简单介绍下Provider中⼏个重要流程:
Camera Service通过调⽤ICameraProvider的getCameraDeviceInterface_v3_x接⼝获取ICameraDevice,在此过程中,Provider会去实例化⼀个CameraDevice对象,并且将之前存有camera_modult_t结构体的CameraModule对象传⼊CameraDevice中,这样就可以在CameraDevice内部通过CameraModule访问到camera_module_t的相关资源,然后将CameraDevice内部类
我的小乖乖TrampolineDeviceInterface_3_2(该类继承并实现了ICameraDevice接⼝)返回给Camera Service。
Camera Service通过之前获取的ICameraDevice,调⽤其open⽅法来打开Camera设备,接着在Provider中会去调⽤CameraDevice对象的open⽅法,在该⽅法内部会去调⽤camera_module_t结构体的open⽅法,从⽽获取到HAL部分的camera3_device_t结构体,紧接着Provider会实例化⼀个CameraDeviceSession对象,并且将刚才获取到的camera3_device_t结构体以参数的⽅式传⼊
CameraDeviceSession中,在CameraDeviceSession的构造⽅法中⼜会调⽤CameraDeviceSession的initialize⽅法,在该⽅法内部⼜会去调⽤camera3_device_t结构体的ops内的initialize⽅法开始HAL部分的初始化⼯作,最后CameraDeviceSession对象被作为
camera3_callback_ops的实现传⼊HAL,接收来⾃HAL的数据或者具体事件,当⼀切动作都完成后,Provider会将假性近视
CameraDeviceSession::TrampolineSessionInterface_3_2(该类继承并实现了ICameraDeviceSession接⼝)对象通过HIDL回调的⽅法返回给Camera Service中。
仲裁
Camera Service通过调⽤ICameraDevcieSession的configureStreams_3_5接⼝进⾏数据流的配置,在Provider中,最终会通过调⽤之前t的拼音