1. Camera系统整体架构:Android Camera软件栈全景图

大家好,我是负责Camera HAL层开发的老工程师了。今天咱们聊聊Android Camera的整体架构。说实话,这个主题我讲了不下十次,但每次都有新感悟。

先问大家一个问题:你按下手机快门,到照片存到相册,中间经历了什么?嗯,这背后就是一套完整的软件栈在协同工作。

1.1 全景图:从App到Kernel的四层结构

Android Camera软件栈,说白了就是四层:App层、Framework层、HAL层、Kernel层。我习惯把这四层想象成一家餐厅——

  • App层:就是顾客,只管点菜(打开相机、拍照)
  • Framework层:是服务员,负责传话、协调
  • HAL层:是大厨,知道怎么做菜(控制硬件)
  • Kernel层:是厨房设备,提供基础工具

下面这张图,是我自己画的架构图,你看一眼就明白了:

Android Camera 软件栈全景图 App 层 Camera App / 第三方相机应用 Framework 层 CameraManager / CameraService / CameraDevice Camera2 API / 回调机制 / 权限管理 HAL 层 Camera HAL 3.x / 4.x 接口 open() / configureStreams() / processCaptureRequest() Kernel 层 V4L2 / ISP驱动 / Sensor驱动 / MIPI CSI 用户空间 内核空间 用户态/内核态分界

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 数据流:一次拍照请求的完整旅程

咱们用一次拍照请求来串一遍整个流程。这样你就能理解各层是怎么配合的了。

  1. App层:调用capture()方法,传入CaptureRequest
  2. Framework层:CameraService收到请求,检查参数合法性,然后通过HAL接口下发
  3. HAL层:调用processCaptureRequest(),把请求转成硬件可理解的格式,发给Kernel驱动
  4. Kernel层:Sensor驱动开始曝光,ISP处理图像数据,生成原始帧
  5. 反向路径:原始帧从Kernel→HAL→Framework→App,最终保存为JPEG

你看,一次拍照经历了四层来回。每一层都有自己该做的事,也有不该做的事。比如HAL层不该去管权限检查,Framework层也不该直接操作Sensor寄存器——这就是边界。

避坑指南:我曾经遇到一个项目,HAL层为了「优化性能」,直接绕过了Framework层的某些校验。结果Android版本升级后,那些校验变成了强制要求,整个HAL层都得重写。所以,千万别跨层做事,否则后面有你受的。

1.5 小结

Android Camera的四层架构,说白了就是一套分工明确的协作体系。App层只管用户体验,Framework层负责调度和权限,HAL层做硬件抽象,Kernel层直接和硬件打交道。

分层设计的好处,我这些年体会最深的就是「可维护性」。你想想看,如果没有HAL层,每个厂商都得改Framework代码,那Android生态早就乱套了。

嗯,这一章就到这里。下一章咱们深入HAL层,看看具体的接口定义和实现细节。


可可精品资料库