安卓 Camera 从硬件到应用显示的完整流程及源码分析
本文首发地址 https://h89.cn/archives/319.html
最新更新地址 https://gitee.com/chenjim/chenjimblog
一、硬件层与驱动交互
- 传感器与驱动
硬件层由图像传感器(如CMOS/CCD)和ISP(图像信号处理器)组成,通过V4L2(Video4Linux2)框架与内核驱动交互。
源码示例:Camera HAL通过/dev/videoX设备节点与传感器通信,如MTK平台的sensor_list.cpp 中通过get_number_of_cameras枚举设备节点。 - HAL硬件抽象层
HAL层实现CameraHardwareInterface接口,封装硬件操作(如open_camera、set_preview_window)。
源码示例:在CameraProvider@HIDL中,通过ICameraProvider接口向框架层提供硬件能力查询和初始化。
二、框架层(Framework)
- CameraService启动
CameraService作为系统服务,由MediaServer进程启动,通过BinderService注册到ServiceManager。
源码路径:frameworks/av/services/camera/libcameraservice/CameraService.cpp 。 - 客户端通信
应用通过CameraManager调用openCamera(),触发CameraDeviceClient的创建。
源码示例:CameraManager.java 通过JNI调用android_hardware_Camera_getNumberOfCameras()与底层交互。 - 预览流程初始化
应用调用createCaptureSession(),框架层通过CameraCaptureSession配置数据流(如SurfaceView/ImageReader)。
关键代码:CameraDeviceClient::createSurface()创建IGraphicBufferProducer用于图像传输。
三、HAL层与数据流
- HAL与HIDL通信
Android O后,HAL通过HIDL接口(如ICameraDevice@3.4)与框架层解耦,实现跨进程调用。
源码示例:cameraserver进程通过CameraProviderManager加载CameraProvider(如external/camera/libcameraservice/)。 - 预览数据流传递
HAL层通过dequeueBuffer()获取缓冲区,填充传感器数据后通过queueBuffer()返回给SurfaceFlinger。
关键流程:Camera3Device::processCaptureResult()处理HAL返回的帧数据,分发至应用层。
四、应用层显示
- SurfaceView与TextureView
应用通过SurfaceHolder或TextureView.SurfaceTexture接收预览流。
源码示例:Camera2Basic示例中,ImageReader的onImageAvailable()回调处理YUV或JPEG数据。 - 图像渲染
数据通过SurfaceFlinger合成后,由OpenGL ES或HWComposer渲染到屏幕。
关键代码:SurfaceTexture::updateTexImage()将图像绑定到GL纹理。
五、关键源码路径汇总
模块 | 源码路径/类 | 功能描述 |
---|---|---|
CameraService | frameworks/av/services/camera/ | 管理相机设备生命周期 |
HAL接口 | hardware/interfaces/camera/ | HIDL接口定义 |
JNI桥接 | frameworks/base/core/jni/ | Java与Native层交互 |
预览控制 | CameraDeviceClient.cpp | 数据流配置与缓冲区管理 |
六、流程总结
-
初始化流程:
应用调用openCamera() → CameraService创建CameraDeviceClient → HAL层加载CameraProvider → 传感器初始化。 -
数据流路径:
传感器 → V4L2驱动 → HAL层 → Camera3Device → SurfaceFlinger → 应用显示。 -
异常处理:
通过CameraCaptureSession.Callback监听错误,触发onError()或重新初始化。
如需更深入分析特定模块(如HIDL接口或图像处理),可参考源码路径及上述搜索结果。
本文链接:安卓 Camera 从硬件到应用显示的完整流程及源码分析 - https://h89.cn/archives/319.html
版权声明:原创文章 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文链接和本声明。