1. Camera系统整体架构
大家好,我是负责Camera HAL层开发的老工程师了。今天咱们聊聊Android Camera的整体架构。说实话,这个主题我讲了不下十次,但每次都有新感悟。
先问大家一个问题:你按下手机快门,到照片存到相册,中间经历了什么?嗯,这背后就是一套完整的软件栈在协同工作。
1.1 全景图:从App到Kernel的四层结构
Android Camera软件栈,说白了就是四层:App层、Framework层、HAL层、Kernel层。我习惯把这四层想象成一家餐厅——
- App层:就是顾客,只管点菜(打开相机、拍照)
- Framework层:是服务员,负责传话、协调
- HAL层:是大厨,知道怎么做菜(控制硬件)
- Kernel层:是厨房设备,提供基础工具
下面这张图,是我自己画的架构图,你看一眼就明白了:
1.2 各层职责与边界
咱们一层一层拆开来看。我当年刚接触Camera时,就是被这些层搞晕的。
App层:用户直接接触的界面
说白了就是相机应用。它调用Framework提供的Camera2 API,完成打开相机、预览、拍照、录像等操作。App层不关心底层是哪个厂商的Sensor,也不管ISP怎么处理图像——它只管发请求、收结果。
Framework层:承上启下的调度中心
这一层是Android系统的核心。我举个例子:当App调用openCamera()时,Framework层的CameraService会做几件事:
- 检查权限(有没有相机权限?)
- 创建
CameraDevice实例 - 通过HAL接口打开底层硬件
Framework层还负责管理多个App同时访问相机的冲突。我记得有个项目,两个App同时抢相机,Framework层处理不好直接导致黑屏。后来我们改了优先级策略才解决。
HAL层:硬件抽象的关键
这一层是我最熟悉的。HAL层把厂商的硬件实现和Android系统解耦。你想想看,高通、联发科、三星的ISP完全不一样,但Android系统通过HAL接口统一了调用方式。
HAL层主要实现这些接口:
open():打开相机设备configureStreams():配置数据流(预览流、拍照流等)processCaptureRequest():处理拍照请求flush():清空请求队列
重点:HAL层是Android Camera性能优化的主战场。我见过太多性能问题,最后都定位到HAL层的实现上。
Kernel层:最底层的硬件驱动
Kernel层负责和硬件直接通信。V4L2(Video for Linux 2)是Linux标准的视频设备驱动框架。ISP驱动、Sensor驱动、MIPI CSI接口都在这一层。
说实话,Kernel层的问题最难排查。有一次我们遇到预览卡顿,查了三天,最后发现是Sensor驱动里一个中断处理函数耗时太长。
1.3 为什么需要分层设计?
这个问题我经常被问到。其实原因很简单——解耦。
我给大家列个表,一看就明白:
| 分层的好处 | 具体说明 | 我遇到的真实案例 |
|---|---|---|
| 厂商可定制 | 不同厂商只需实现HAL接口,Framework层不用改 | 高通和联发科的HAL实现完全不同,但Framework层代码一样 |
| 系统升级方便 | Android版本升级时,HAL接口保持兼容 | Android 12到13,HAL接口基本没变,我们只改了一小部分 |
| 问题隔离 | App崩溃不会影响Kernel,Kernel问题不会直接导致App挂掉 | 有一次HAL层内存泄漏,Framework层捕获了异常,App只是闪退,没死机 |
| 开发并行 | App团队、Framework团队、HAL团队可以同时开发 | 我们项目组三个团队并行开发,靠接口文档对齐,效率很高 |
个人经验:分层设计最大的坑是「层间通信开销」。每次跨层调用都有性能损耗。我建议在性能敏感路径上,尽量减少跨层调用次数。比如预览帧数据,能一次传尽量别分多次。
1.4 数据流:一次拍照请求的完整旅程
咱们用一次拍照请求来串一遍整个流程。这样你就能理解各层是怎么配合的了。
- App层:调用
capture()方法,传入CaptureRequest - Framework层:CameraService收到请求,检查参数合法性,然后通过HAL接口下发
- HAL层:调用
processCaptureRequest(),把请求转成硬件可理解的格式,发给Kernel驱动 - Kernel层:Sensor驱动开始曝光,ISP处理图像数据,生成原始帧
- 反向路径:原始帧从Kernel→HAL→Framework→App,最终保存为JPEG
你看,一次拍照经历了四层来回。每一层都有自己该做的事,也有不该做的事。比如HAL层不该去管权限检查,Framework层也不该直接操作Sensor寄存器——这就是边界。
避坑指南:我曾经遇到一个项目,HAL层为了「优化性能」,直接绕过了Framework层的某些校验。结果Android版本升级后,那些校验变成了强制要求,整个HAL层都得重写。所以,千万别跨层做事,否则后面有你受的。
1.5 小结
Android Camera的四层架构,说白了就是一套分工明确的协作体系。App层只管用户体验,Framework层负责调度和权限,HAL层做硬件抽象,Kernel层直接和硬件打交道。
分层设计的好处,我这些年体会最深的就是「可维护性」。你想想看,如果没有HAL层,每个厂商都得改Framework代码,那Android生态早就乱套了。
嗯,这一章就到这里。下一章咱们深入HAL层,看看具体的接口定义和实现细节。
可可精品资料库