相关文章
- [Android O] Camera 服务启动流程简析
- [Android O] HAL3 之 Open Camera2 流程(零)—— 概览
- [Android O] HAL3 之 Open Camera2 流程(一)—— 从 App 到 CameraService
- [Android O] HAL3 之 Open Camera2 流程(二)—— 从 CameraService 到 HAL Service
- [Android O] HAL3 之 Open Camera2 流程(三,完结)—— 从 HAL Service 到 Camera HAL
之前已经分析了从 App 到 CameraService 的连路创建流程,接下来要分析的是从 CameraService 到 HAL Service 的连接过程。
由于 Android O 中加入了 Treble 机制,它带来的一个巨大变化就是将原本的 CameraServer
进程分隔成 CameraServer
与 Provider service
两个进程,它们之间通过 HIDL(一个类似 Binder 的机制)进行通信。
在这种情况下,CameraServer
一端主体为 CameraService,它将会寻找现存的 Provider service
,将其加入到内部的 CameraProviderManager 中进行管理,相关操作都是通过远端调用进行的。
而 Provider service
一端的主体为 CameraProvider,它在初始化时就已经连接到 libhardware
的 Camera HAL 实现层,并以 CameraModule 来进行管理。
这两个进程的启动与初始化是在系统启动时就进行的,相关的分析可以参照我的另一篇博文。
进程的启动后,连路的 “载体” 就搭建完成了(需要注意,此时 QCamera3HWI 还未创建),可用下图简单表示。
(我之前的博文中没有分析远端 CameraDevice 的创建,但这个类确实需要注意,因为它是连接到 HAL 接口层的中介。)
而在打开相机时,该层的完整连路会被创建出来。
这一部分的主要调用逻辑如下图。
上回讲到,在 CameraService::makeClient
中,实例化了一个 CameraDeviceClient。现在我们就从它的构造函数开始,继续探索打开相机的流程。
这一部分主要活动在 Runtime
层,这里分成 CameraService 与 HAL Service 两侧来分析。
CS
CameraDeviceClient
文件路径:frameworks\av\services\camera\libcameraservice\api2\CameraDeviceClient.cpp
先来看看它的构造函数,主要注意第 9、10 行,关于它的父类 Camera2ClientBase 的构造,这是创建连路的一个关键节点。在下一个小节会对它进行分析。
CameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService,
const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback,
const String16& clientPackageName,
const String8& cameraId,
int cameraFacing,
int clientPid,
uid_t clientUid,
int servicePid) :
Camera2ClientBase(cameraService, remoteCallback, clientPackageName,
cameraId, cameraFacing, clientPid, clientUid, servicePid),
mInputStream(),
mStreamingRequestId(REQUEST_ID_NONE),
mRequestIdCounter(0),
mPrivilegedClient(false) {
char value[PROPERTY_VALUE_MAX];
property_get("persist.camera.privapp.list", value, "");
String16 packagelist(value);
if (packagelist.contains(clientPackageName.string())) {
mPrivilegedClient = true;
}
ATRACE_CALL();
ALOGI("CameraDeviceClient %s: Opened", cameraId.string());
}
CameraService 在创建 CameraDeviceClient 之后,会调用它的