(1)Hal3架构分析
(A)应用框架
应用代码位于应用框架级别,它使用 Camera 2 API与相机硬件进行交互。在内部,这些代码会调用相应的 Binder 接口,以访问与相机互动的原生代码。
(B)AIDL(Binder IPC 接口)
与 CameraService 关联的 binder 接口可在 frameworks/av/camera/aidl/android/hardware 中找到。生成的代码会调用较低级别的原生代码以获取对实体相机的访问权限,并返回用于在框架级别创建 CameraDevice 并最终创建 CameraCaptureSession 对象的数据。
//frameworks/av/camera/aidl/android/hardware
ICameraService.aidl——相机服务的接口;
ICameraServiceListener.aidl——应用框架CameraService的回调;
ICameraDeviceUser.aidl——已打开的特定相机设备的接口;
ICameraDeviceCallbacks.aidl——对应用框架CameraDevice的回调。
(C)原生框架
此框架位于 frameworks/av/ 中,并提供相当于 CameraDevice 和 CameraCaptureSession 类的原生类。
(D)相机服务
位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp 下的相机服务是与 HAL 进行互动的实际代码。
(E)HIDL(Binder IPC 接口)
//hardware/interfaces/camera
├── common
│ └── 1.0
├── device
│ ├── 1.0
│ ├── 3.2
│ ├── 3.3
│ ├── 3.4
│ └── 3.5
│ └── 3.6
├── metadata
│ ├── 3.2
│ ├── 3.3
│ └── 3.4
│ └── 3.5
└── provider
│ └── 2.4
│ └── 2.5
│ └── 2.6
上述以数字为名的目录代表版本号。可以通过manifest.xml确定。其他可以分析函数CameraProviderManager::openSession。
另外还有两个HIDL:
[email protected]
[email protected]
不同的是[email protected]不但是个共享库,还是个进程。而上述两个只是共享库。
另外要说明点是cameraserver只与[email protected]服务直接通过HIDL建立连接。其他的关于camera HIDL源码中的类都需要通过[email protected]。
(F)HAL
硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。
实现 HAL
HAL 位于相机驱动程序和更高级别的 Android 框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。相机 HAL 的 HIDL 接口在 hardware/interfaces/camera 中定义。
典型的绑定式 HAL 必须实现以下 HIDL 接口:
ICameraProvider——用于枚举单个设备并管理其状态
ICameraDevice——相机设备接口
ICameraDeviceSession——相机设备会话接口
以上来源于Android官网:相机官网
(2)Hal3模块分析
谷歌根据职能的不同将Camera框架一共划分成了五层,分别是App、Service、Provider、Driver以及Hardware。
(A)Camera App
应用层处于整个框架的顶端,承担着于用户直接进行交互的责任,承接来自用户直接或者间接的比如预览/拍照/录像等一系列具体需求,一旦接收到用户相关UI操作,便会通过Camera Api2标准接口将需求发送至Camera Framework部分,并且等待Camera Framework回传处理结果,其中包括了图像数据以及整体相机系统状态参数,之后将结果以一定方式反馈给用户。
(B)Camera Framework
该层主要位于Camera App与Camera Service之间,以jar包的形式运行在App进程中,它封装了Camera Api2接口的实现细节,暴露接口给App进行调用,进而接收来自App的请求,同时维护着请求在内部流转的业务逻辑,最终通过调用Camera AIDL跨进程接口将请求发送至Camera Service中进行处理,紧接着,等待Camera Service结果的回传,进而将最终结果发送至App。
(C)Camera Service
该层位于Camera Framework与Camera Provider之间,作为一个独立进程存在于Android系统中,在系统启动初期会运行起来,它封装了Camera AIDL跨进程接口,提供给Framework进行调用,进而接收来自Framework的图像请求,同时内部维护着关于请求在该层的处理逻辑,最终通过调用Camera HIDL跨进程接口将请求再次下发到Camera Provider中,并且等待结果的回传,进而将结果上传至Framework中。
(D)Camera Provider
该层位于Camera Service与Camera Driver之间,作为一个独立的进程存在于Android系统中,同时在系统启动初期被运行,提供Camera HIDL跨进程接口供Camera Service进行调用,封装了该接口的实现细节,接收来自Service的图像请求,并且内部加载了Camera HAL Module,该Module由OEM/ODM实现,遵循谷歌制定的标准Camera HAL3接口,进而通过该接口控制Camera HAL部分,最后等待Camera HAL的结果回传,紧接着Provider通过Camera HIDL接口将结果发送至Camera Service。
(E)Camera Hardware
相机硬件处在整个相机体系的最底层,是相机系统的物理实现部分,该部分包括镜头、感光器、ISP三个最重要的模块,还有对焦马达、闪光灯、滤光片、光圈等辅助模块。镜头的作用是汇聚光线,利用光的折射性把射入的光线汇聚到感光器上。感光器的作用是负责光电转换,通过内部感光元件将接收到的光信号转换为电子信号进而通过数电转换模块转为数字信号,并最后传给ISP。ISP负责对数字图像进行一些算法处理,如白平衡、降噪、去马赛克等。