Android Camera框架分析


(该图转自他人,源作者不详)
该图很清晰的说明了Camera启动时从上到下的调用过程。
ICameraClient/ICameraSerice/ICamera是接口类,其功能真正实现是在继承了BnCamera*的Camera*中,而BpCamera*对象是在远程端用Binder来和Camera*对象通信的。

第四步比较复杂,解释如下:
init.rc脚本会加载mediaserver,mediaserver中会创建CameraService。
getCameraService时会创建sp<ICameraService>类型,其实就是在CameraClient端创建CameraService的proxy,创建sp强引用类型会调用CameraService::onFirstRef->hw_get_module
->hw_get_module_by_class(class_id:a string “Camera” or other name):
It will search variant_keys[i].camera.so in HAL_LIBRARY_PATH, then load(dlopen) it, and set hw_module_t.
static const char *variant_keys[] = {"ro.hardware", "ro.product.board","ro.board.platform","ro.arch"};
从以上看出在get CameraService 时会加载板子支持的 Camera lib

c->mCamera = cs->connect,是BpCameraService->Connect,在其内部会创建BpCamera,BpCamera由CameraService的内部类Client来继承并实现;下面再说Client。
BpCameraService->Connect中同样会通过binder机制调用BnCameraService->Connect 其是虚函数,最终会调用BnCameraService的真正实现CameraService->connect,connect里会new client,并将该client的proxy返回给c->mCamera,而在构造Client时会使用创建CameraSerice时得到的hw_module_t来get_camera_info,并new CameraHardwareInterface,initialize(真正openhardware),因此说CameraService中的Client对象真正实现了camera需要和HAL打交道到部分。

通过以上步骤,CameraClient就真正和Client(真正实现了camera需要和HAL打交道到部分)端联系起来了

哇哦,好拐!别把CameraClient和Client搞混。
总结:
1. 系统启动创建CameraService
2. 启动camera时创建CameraClient(即Camera的实例)
3. getCameraServiceCameraClient取得CameraService的proxy
4. 创建sp<CameraService>时会调用onFirstRef->hw_get_module->hw_get_module_by_class,来加载Camera Library取得hw_module_t
5. CameraService通过connect, 首先会取得CameraClient的proxy(),保存mCameraClient,然后根据CameraID之前取得的结构体hw_module_t调用libraryt创建CameraHardwareInterface,并initialize(open hardware),再用hardware这个参数new其对应的Client,每个Client对应一个真实sensor
6. CameraClient通过cs->Connect会取得Client的proxy
7. 上层CameraClient会通过Client的proxy来执行StartPreview等各种动作,Client会通过CameraClient的proxy来handlePreviewData等

下图是参考Camera为另一个项目画的各层类的继承关系图,将WaveManager改为Camera,该图即为Camera各层类的继承和通信关系
红色双箭头表示Binder通信,黑色箭头表示继承自,绿色箭头表示持有。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值