跟着卷卷龙一起学 Camera--CameraService
CameraService 启动流程
这里 main_cameraserver 将把 cameraservice 服务注册 serviceManager 里,那么 APP 端可以通过 serviceManager 来获取这个服务。在枚举 cameraProvider 的时候,同时也检查自己是否被注册为服务。再通过 cameraProviderManager 去获取已经注册的 cameraprovider 服务。完成了 CameraService 的启动和初始化工作,并将 CameraService 注册到了 ServiceManager,那么其他地方,就可以通过 ServiceManager 去获取这个服务。在 onFirstRef()枚举 CameraProvider,注册 UID 和 Sensor 的 Policy,通过 HIDL 检查自身是否已经注册成为服务,最后检查 CameraServiceProxy。ICameraProvider 里获取之前注册的 cameraProvider 远程服务
CameraProvider 启动流程
这里 service 将 cameraProvider 注册到 providerManager 里,那么 cameraservice 可以通过这个 providerManager 来获取这个服务。
CameraProvider 实例化对象的时候调用了 startThreadPool() 函数就已经有线程在等待了,startThreadPool()会调用 joinRpcThreadpool() 函数,而这里的 joinRpcThreadpool() 其实就是把主线程也放入线程池中等待请求,防止这个进程退出.CameraModule::init()在 init 函数中,会根据 HAL 版本调用 camera_module_t->init 函数,最后通过 getNumbersOfCameras()获取当前设备 camera 数量并保存在 mCameraInfoMap
CameraService 的 Connect 流程
在打开相机 sensor 时,APP 会调用 open 接口,触发 cameraservice 的 connect 接口中的 connectHelper,再调用到 camera3device 的构造和 initialize 函数。在初始化中会 getCameraCharacteristics 获取静态参数和 supportNativeZoomRatio 获取缩放倍率,以及获取 HalInterface 的 handle。HAL 没有 Framework 那么复杂的。 Android 其他模块代码的调用流程可参考 Camera 。如果做驱动开发又想了解 Android framework 框架,建议先跳过 Java 层代码。从 CPP 开始跟代码,逐步理解 Framework 与 HAL 的关系。然后再跟 Java 层的代码。
cameraservice 的 request 流程
版权声明: 本文为 InfoQ 作者【卷卷龙】的原创文章。
原文链接:【http://xie.infoq.cn/article/200a023aa760fec1ac3ebeba2】。文章转载请联系作者。
评论