[Android O] HAL3 之 Open Camera2 流程(二)—— 从 CameraService 到 HAL Service

本文详细分析了Android O中从CameraService到HAL Service的连接过程,涉及CameraDeviceClient、Camera2ClientBase、Camera3Device等组件。在Treble机制下,CameraService与HAL Service通过HIDL通信。文中介绍了CameraDeviceClient的构造函数及初始化,Camera2ClientBase和Camera3Device的角色,以及CameraProviderManager如何开启远程Session。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关文章


之前已经分析了从 App 到 CameraService 的连路创建流程,接下来要分析的是从 CameraService 到 HAL Service 的连接过程。

由于 Android O 中加入了 Treble 机制,它带来的一个巨大变化就是将原本的 CameraServer 进程分隔成 CameraServerProvider service 两个进程,它们之间通过 HIDL(一个类似 Binder 的机制)进行通信。
在这种情况下,CameraServer 一端主体为 CameraService,它将会寻找现存的 Provider service,将其加入到内部的 CameraProviderManager 中进行管理,相关操作都是通过远端调用进行的。
Provider service 一端的主体为 CameraProvider,它在初始化时就已经连接到 libhardware 的 Camera HAL 实现层,并以 CameraModule 来进行管理。

这两个进程的启动与初始化是在系统启动时就进行的,相关的分析可以参照我的另一篇博文
进程的启动后,连路的 “载体” 就搭建完成了(需要注意,此时 QCamera3HWI 还未创建),可用下图简单表示。
(我之前的博文中没有分析远端 CameraDevice 的创建,但这个类确实需要注意,因为它是连接到 HAL 接口层的中介。)
@图. CS 到 HAL 的连路载体

而在打开相机时,该层的完整连路会被创建出来。

这一部分的主要调用逻辑如下图。
@图. CS 到 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 之后,会调用它的

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值