Android camera open 流程( 四 )


->(er) 初始化实例 。注意此处的模板类型即是 ,传入的参数er则是与 HAL有关 。
主要是根据 API 版本以及 HAL 版本来选择生成具体的实例, 一般驱动版本和设备版本是相同的,所以进入第一个if分支,参数是在调用方法时传入的,值为API_2,所以进入else分支,直接使用我们上边传进来的参数构造一个对象,而该对象也就是我们应用进程和进程通信的使者了,所有的工作都是由它来进行中转的 。
Status CameraService::makeClient(const sp& cameraService,804const sp& cameraCb, const String16& packageName,805const std::unique_ptr& featureId, const String8& cameraId, int api1CameraId,806int facing, int clientPid, uid_t clientUid, int servicePid, int halVersion,807int deviceVersion, apiLevel effectiveApiLevel,808/*out*/sp* client) {809810if (halVersion < 0 || halVersion == deviceVersion) {811// Default path: HAL version is unspecified by caller, create CameraClient812// based on device version reported by the HAL.813switch(deviceVersion) {814case CAMERA_DEVICE_API_VERSION_1_0:815if (effectiveApiLevel == API_1) {// Camera1 API route816sp tmp = static_cast(cameraCb.get());817*client = new CameraClient(cameraService, tmp, packageName, featureId,818api1CameraId, facing, clientPid, clientUid,819getpid());820} else { // Camera2 API route821ALOGW("Camera using old HAL version: %d", deviceVersion);822return STATUS_ERROR_FMT(ERROR_DEPRECATED_HAL,823"Camera device \"%s\" HAL version %d does not support camera2 API",824cameraId.string(), deviceVersion);825}826break;827case CAMERA_DEVICE_API_VERSION_3_0:828case CAMERA_DEVICE_API_VERSION_3_1:829case CAMERA_DEVICE_API_VERSION_3_2:830case CAMERA_DEVICE_API_VERSION_3_3:831case CAMERA_DEVICE_API_VERSION_3_4:832case CAMERA_DEVICE_API_VERSION_3_5:833case CAMERA_DEVICE_API_VERSION_3_6:834if (effectiveApiLevel == API_1) { // Camera1 API route835sp tmp = static_cast(cameraCb.get());836*client = new Camera2Client(cameraService, tmp, packageName, featureId,837cameraId, api1CameraId,838facing, clientPid, clientUid,839servicePid);840} else { // Camera2 API route841sp tmp =842static_cast(cameraCb.get());843*client = new CameraDeviceClient(cameraService, tmp, packageName, featureId,844cameraId, facing, clientPid, clientUid, servicePid);845}846break;847default:848// Should not be reachable849ALOGE("Unknown camera device HAL version: %d", deviceVersion);850return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION,851"Camera device \"%s\" has unknown HAL version %d",852cameraId.string(), deviceVersion);853}854} else { 。。。。。。。。。。。。873}874return Status::ok();}
最终这一就沿着前面分析下来的路径返回到实例中,被保存到 。至此,打开相机流程中,从 App 到的调用逻辑基本上就算走完了 。
根据上面的流程追踪,我们可以描绘一个比较简单直观的连路框架图,如下 。
其中黑色虚线表示下行(控制)路线,红色虚线表明上行(状态、数据)路线 。

Android camera open 流程

文章插图
接下来要分析的是从到 HAL的连接过程 。
从到 HAL
中加入了机制,它带来的一个巨大变化就是将原本的进程分隔成与两个进程,它们之间通过 HIDL(一个类似的机制)进行通信 。
【Android camera open 流程】在这种情况下,一端主体为 ,它将会寻找现存的,将其加入到内部的 r 中进行管理,相关操作都是通过远端调用进行的 。
而一端的主体为 ,它在初始化时就已经连接到的HAL 实现层,并以来进行管理, 而这两个进程的启动与初始化是在系统启动时就进行的
Android camera open 流程

文章插图