携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
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流程