[Android O] HAL3 之 Open Camera2 流程(一)—— 从 App 到 CameraService

本文详细介绍了Android O中从应用程序到CameraService的Open Camera2流程,涉及App、Framework和Runtime三个层次。通过分析CameraManager和CameraDeviceImpl的代码,揭示了Binder机制在连接过程中的作用。

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

相关文章


Application 连接到 CameraService,这涉及到 Android 架构中的三个层次:App 层,Framework 层,Runtime 层。
其中,App 层直接调用 Framework 层所封装的方法,而 Framework 层需要通过 Binder 远程调用 Runtime 中 CameraService 的函数。

这一部分主要的函数调用逻辑如下图所示。
@图. App to CS 函数调用逻辑

下面开始分析相关代码。

App

关于应用这方面,我只是略懂一二,具体的实现就不管它了。
在 App 中,需要调用打开相机的接口,如下。

其中:

  • mCameraManager 是 CameraManager 类的实例。
  • currentCameraId 则是需要打开的相机设备号。
  • stateCallback 是 CameraDevice.StateCallback,是关于相机打开情况的相关回调。
  • backgroundHandler 则是 StateCallback 需要调用的 Handler
mCameraManager.openCamera(currentCameraId, stateCallback, backgroundHandler);

以上内容参考自掘金网的一篇文章

Framework

CameraManager

文件路径:/frameworks/base/core/java/android/hardware/camera2/CameraManager.java

最初的入口就是 CameraManager 的 openCamera 方法。
但通过代码可以看到,它仅仅是调用了 openCameraForUid 方法。

@RequiresPermission(android.Manifest.permission.CAMERA)
public void openCamera(@NonNull String cameraId,
        @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
        throws CameraAccessException {
   

    openCameraForUid(cameraId, callback, handler, USE_CALLING_UID);
}

下面的代码忽略掉了一些参数检查相关操作,最终主要调用了 openCameraDeviceUserAsync 方法。

public void openCameraForUid(@NonNull String cameraId,
        @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler,
        int clientUid)
        throws CameraAccessException {
   
	/* Do something in*/
    ......
    /* Do something out*/
    openCameraDeviceUserAsync(cameraId, callback, handler, clientUid);
}

分析下面的代码:

  • 第 11~17 行,首先实例化一个 CameraDeviceImpl。值得注意的是,构造时传入了 CameraDevice.StateCallback 以及 Handler
  • 第 19 行,获取 CameraDeviceCallback 实例,这是提供给远端连接到 CameraDeviceImpl 的接口。
  • 第 22~32 行,HAL3 中走的是这一部分逻辑,主要是从 CameraManagerGlobal 中获取 CameraService 的本地接口,通过它远端调用(采用 Binder 机制) connectDevice 方法连接到相机设备。注意返回的 cameraUser 实际上指向的是远端 CameraDeviceClient 的本地接口。
  • 为了缩短篇幅,省略了捕获异常的相关代码。
  • 第 56 行,将 CameraDeviceClient 设置到 CameraDeviceImpl 中进行管理。
private CameraDevice openCameraDeviceUserAsync(String cameraId,
        CameraDevice.StateCallback callback, Handler handler, final int uid)
        throws CameraAccessException {
   
    CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
    CameraDevice device = null;

    synchronized (mLock) {
   

        ICameraDeviceUser cameraUser = null;

        android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
                new android.hardware.camera2.impl.CameraDeviceImpl(
                    cameraId,
                    callback,
                    handler,
                    characteristics,
                    mContext.getApplicationInfo().
<think>好的,我现在需要解决用户关于CamX-CHI中camera open方法的工作原理的问题。首先,用户提到了几个关键点:Camera3_device_t、Camera3DeviceOps、g_camera3DeviceOps等,需要详细解释这些组件在打开相机时的作用和工作流程。 首先,我应该回忆CamX-CHI架构的基本结构。CamX是Qualcomm的相机HAL层框架,而CHI(Camera Hardware Interface)是自定义的扩展层,允许OEM进行定制。用户提到的camera3_device_t是HAL3的标准结构体,里面包含设备操作的方法指针,比如open、configure_streams等。而g_camera3DeviceOps是CamX中定义的具体操作方法,比如initialize、configure_streams等。 接下来,用户想了解camera open方法的具体流程。根据引用[2],当App调用CameraDevice.createCaptureSession时,最终会通过HIDL接口通知Provider,进而调用CamX-CHI中的configure_streams。不过用户的问题是关于open方法的,可能需要从设备打开的过程开始分析。 根据HAL3的标准流程,当App打开相机设备时,会调用HAL层的camera3_device的open方法。在CamX中,这个open方法可能被映射到CamX的具体实现,比如CamX::initialize函数,这在g_camera3DeviceOps结构体中被指定为initialize方法。初始化过程中,CamX会创建HALDevice实例,并初始化CHI组件,比如加载CHI覆盖模块,设置回调函数等,如引用[3]提到的CHIAppCallbacks。 然后,流程可能涉及HALDevice的初始化,建立与底层硬件的连接,配置数据流,以及准备处理请求。在Initialize过程中,CamX会设置必要的回调,比如ProcessCaptureResult和Notify,用于处理捕获结果和通知事件。这些回调函数在HAL3标准中是必须的,用于异步返回数据给上层。 另外,用户提到的Camera3DeviceOps结构体中的方法,如configure_streams、process_capture_request等,这些在CamX中具体实现,并被封装到g_camera3DeviceOps中。当Provider调用configure_streams时,CamX-CHI会处理流的配置,这可能涉及到CHI组件的调用,比如通过CHI的扩展接口进行自定义配置。 需要确认CamX中的open流程是否包括HALDevice的创建、CHI模块的加载、回调函数的注册等步骤。例如,在初始化时,CamX可能调用ChiModule的初始化,加载CHI的库,并获取CHI的回调函数,如m_ChiAppCallbacks,这样在后续操作中可以调用CHI的自定义处理逻辑。 此外,ProcessCaptureResult和Notify是HAL3中用于返回捕获结果和发送通知的函数,CamX需要在这些函数中处理来自底层的数据,并通过HIDL接口上传到Camera Service,再传给App。这可能涉及到数据队列的管理、元数据的处理等。 总结起来,工作流程可能如下: 1. App调用CameraManager.openCamera,触发Camera Service的open操作。 2. Camera Service通过HIDL调用到CamX HALcamera3_module的open方法。 3. CamX创建camera3_device实例,并将g_camera3DeviceOps赋值给其ops字段。 4. CamX的initialize方法被调用,进行设备初始化,创建HALDevice,加载CHI模块,设置回调。 5. CHI模块进行硬件特定的初始化,注册自定义的回调函数。 6. 当App配置会话时,configure_streams被调用,CamX-CHI处理流配置。 7. 处理请求时,process_capture_request被调用,CamX和CHI协同处理捕获请求,并通过ProcessCaptureResult返回结果。 需要验证这些步骤是否正确,特别是CamX中open方法的具体实现,以及CHI如何介入初始化流程。同时,确保引用的资料中的内容被正确引用,比如引用[1]中提到的g_camera3DeviceOps结构体的定义,包含initialize、configure_streams等方法,这对应到HAL3的操作函数。 可能还需要考虑HALDevice和CHI之间的交互,比如在初始化过程中,HALDevice如何调用CHI的接口进行扩展配置,以及回调函数如何设置,使得CHI可以处理特定的操作。例如,引用[3]提到的CHIAppCallbacks可能用于CHI模块向CamX注册自己的回调函数,处理特定的通知或数据。 最后,确保回答结构清晰,分步骤解释,并正确引用提供的参考文献中的内容。</think>### Camera Open方法在CamX-CHI中的工作原理及实现细节 #### 1. **HAL3标准框架与CamX-CHI的关联** 在Android HAL3标准中,相机设备的操作通过`camera3_device_t`结构体实现,其核心方法由`camera3_device_ops_t`定义。CamX-CHI作为高通相机HAL实现,通过`g_camera3DeviceOps`结构体[^1]将标准HAL3接口映射到内部逻辑: ```c static camera3_device_ops_t g_camera3DeviceOps = { CamX::initialize, // 设备初始化 CamX::configure_streams, // 数据流配置 NULL, CamX::construct_default_request_settings, CamX::process_capture_request, // 处理捕获请求 NULL, CamX::dump, CamX::flush, {0} }; ``` #### 2. **Camera Open流程的核心步骤** 当应用调用`CameraManager.openCamera()`时,工作流程如下: 1. **HAL层调用入口** Camera Service通过HIDL接口`ICameraDevice::open()`触发CamX的`camera3_module->common.methods->open()`,最终创建`camera3_device`实例,并绑定`g_camera3DeviceOps`[^1]。 2. **设备初始化(initialize方法)** `CamX::initialize`负责: - 创建`HALDevice`对象,管理物理相机设备。 - 加载CHI模块(如`libchi.so`),并通过`ChiModule::Initialize()`注册CHI扩展回调`m_ChiAppCallbacks`[^3]。 - 初始化硬件抽象层(如传感器、ISP等),建立数据管道。 3. **CHI层的扩展配置** CHI(Camera Hardware Interface)通过`m_ChiAppCallbacks`覆盖CamX默认行为,例如: - 自定义图像处理管线(如降噪、HDR)。 - 注册CHI特定的元数据处理器。 4. **数据流准备与回调绑定** - `ProcessCaptureResult`和`Notify`是HAL3标准要求的回调函数,CamX通过它们向Camera Service返回捕获结果和事件通知。 - 在初始化阶段,CamX会绑定这些回调到CHI模块的处理逻辑(如结果队列管理和元数据注入)。 #### 3. **关键数据结构与交互** - **camera3_device_t** 包含设备操作函数指针(`ops`字段指向`g_camera3DeviceOps`)和设备状态信息。 - **HALDevice** CamX内部对象,封装硬件资源(如Sensor、ISP、内存池)和流水线配置。 - **CHI回调机制** 通过`CHIAppCallbacks`实现CamX与CHI模块的双向通信,例如: - `ChiProcessCaptureResult`:CHI处理后的捕获结果回传给CamX。 - `ChiNotify`:CHI触发的事件(如错误码或硬件状态变更)。 #### 4. **流程示例:从Open到首帧返回** 1. App调用`CameraDevice.createCaptureSession()`。 2. Camera Service通过`CameraDeviceClient.endConfigure()`调用HAL的`configure_streams`[^2]。 3. CamX-CHI通过`g_camera3DeviceOps.configure_streams`配置数据流,并初始化硬件流水线。 4. App发送首个`CaptureRequest`,CamX调用`process_capture_request`,CHI模块处理请求并触发传感器捕获。 5. 捕获数据经ISP处理后,通过`ProcessCaptureResult`回调返回给App[^2]。 ####
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值