1. Camera 子系统从上到下分别是 App/FrameworkCameraServiceHAL Impl
  2. App/Framework vs CameraService 之间,通过 AIDL binder 通信
  3. CameraService vs Camera HAL 之间,通过 HIDL binder 通信

App Framework 部分是最上层部分,包括 Java & C++ 代码,实现了 Android Camera2 API 接口,提供给 android 应用使用,Java 部分包含在 Android SDK 里面。

source tree

  • Java 实现:

    • https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/hardware/
    • https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/hardware/camera2
  • C++ 实现:
    • https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/jni/

CameraService 是中间桥梁,负责沟通 Framework 与 Camera 硬件设备,把上层的调用需求透过 camera hal 接口转发给 HAL 硬件实现,同时返回处理结果。

source tree

  • C++ 实现:

    • https://android.googlesource.com/platform/frameworks/av/+/refs/heads/master/camera/
    • https://android.googlesource.com/platform/frameworks/av/+/refs/heads/master/services/camera/libcameraservice/
    • https://android.googlesource.com/platform/frameworks/hardware/interfaces/+/refs/heads/master/cameraservice/

Camera HAL 是硬件适配层,针对不同 camera 硬件模组,由 OEM 厂商提供具体实现

source tree

  • Treble 架构

    • https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/master/camera/
  • Legacy
    • https://android.googlesource.com/platform/hardware/libhardware/+/refs/heads/master/modules/camera/

cameraserver

frameworks/av/camera/cameraserver/main_cameraserver.cpp

frameworks/av/camera/cameraserver/cameraserver.rc

1
2
3
4
5
6
7
service cameraserver /system/bin/cameraserverclass mainuser cameraservergroup audio camera input drmrpcioprio rt 4task_profiles CameraServiceCapacity MaxPerformancerlimit rtprio 10 10

HAL Impl

Camera Provider 实现

首先,实现 hal 独立运行的进程,并向 hwservicemanager 注册 ICameraProvider 服务,对上层提供硬件功能,包括设备状态信息的查询/更新,获取设备接口以便可以调用设备功能。

AOSP 代码目前有两个 ICameraProvider 服务进程:

  • legacy/0, 给内置相机用, 所以目前为止,Camera HALv3 实现还是属于传统 HAL,参考HAL 类型
  • external/0, Android P 新增的调用外接 usb 相机的 HAL 服务进程

它们都有对应的启动脚本,在系统启动时加载运行。所以内置相机外接相机的HAL 实现是分别在两个不同进程里面,各自独立互不影响!

如果需要还可以扩展更多 camera provider,比如 internallegacyexternalremote 等等,只要具备以下几个条件,cameraservice 就能透过 CameraProviderManager 查询到该服务并查询到 camera 设备列表,供 App Framework 使用该相机设备:

  • 启动脚本
  • 启动 binary,调用 defaultPassthroughServiceImplementation 注册服务
  • manifest camera.provider 节点声明,包括 ßtransport 类型和 instance 实例节点名称

进程启动时,会完成这么几件事,跟 hwservicemanager以及PassthroughServiceManager的交互通过 binder IPC 调用完成

  1. 确保 /dev/vndbinder 对应的 binder 服务进程已经启动,如果没有则启动它
  2. 在该进程里透过 android_dlopen_ext/dlopen 加载对应版本的库,这里是android.hardware.camera.provider@2.4-impl.so
  3. 透过 dlsym 获取到 HIDL_FETCH_ICameraProvider 方法,然后遍历 manifest 里面 camera.provider 这个 hidl 接口声明的 instance 实例名称,作为参数调用该方法, 即可获取到该实例对应的 ICameraProvider 实现
  4. 向 hwservicemanager 注册该服务:
    • 首先在 hwservicemanager 中插入一个 HidlService (interfaceName, instanceName)
    • 其次生成的 CameraProvider 对象也要透过 IPC 调用 hidl::manager::add 把自己添加到 hwservicemanager,因为上一步已经插入了一个对应的 HidlService 所以仅仅是更新 pid和 service 指向实例对象
    • (interfaceName, instanceName) 对应 internal camera provider 就是 (“android.hardware.camera.provider@2.4::ICameraProvider”, “/legacy/0”),

这几个步骤都在当前启动的进程里面调用 defaultPassthroughServiceImplementation 完成的,所以调用过程中透过 IPCThreadState::self()->getCallingPid() 获取到当前进程的pid,也就是提供服务的进程。

详细代码可以跟踪该函数查阅,另外还要参考 hardware/interfaces/camera 源代码下面 *.hal 编译时由 hidl-gen 生成的中间源代码

HidlService 保持的信息如下,包括接口名称实例名称实例对象, HAL进程pid

struct HidlService {HidlService(const std::string &interfaceName,const std::string &instanceName,const sp<IBase> &service,const pid_t pid);HidlService(const std::string &interfaceName,const std::string &instanceName): HidlService(interfaceName,instanceName,nullptr,static_cast<pid_t>(IServiceManager::PidConstant::NO_PID)){}virtual ~HidlService() {}...

这里可以看到,同一个 hidl 接口,可以有多个实例实现,对应不同类型的硬件设备,比如这里 /legacy/0 对应内置相机,/external/0 对应外接 usb 相机,它们的 interfaceName 一样,instanceName 不一样。并且各自有自己的独立进程。

camera.provider 接口声明,包括 transport 是 hwbinder, 实例有两个 legacy/0external/0

manifest.xml :

<hal format="hidl"><name>android.hardware.camera.provider</name><transport>hwbinder</transport><version>2.4</version><interface><name>ICameraProvider</name><instance>legacy/0</instance><instance>external/0</instance></interface><fqname>@2.4::ICameraProvider/legacy/0</fqname>
</hal>

hardware/interfaces/camera/provider/2.4/default/service.cpp

int main()
{ALOGI("CameraProvider@2.4 legacy service is starting.");// The camera HAL may communicate to other vendor components via// /dev/vndbinderandroid::ProcessState::initWithDriver("/dev/vndbinder");status_t status;if (kLazyService) {status = defaultLazyPassthroughServiceImplementation<ICameraProvider>("legacy/0",/*maxThreads*/ 6);} else {status = defaultPassthroughServiceImplementation<ICameraProvider>("legacy/0",/*maxThreads*/ 6);}return status;
}

hardware/interfaces/camera/provider/2.4/default/external-service.cpp

int main()
{ALOGI("External camera provider service is starting.");// The camera HAL may communicate to other vendor components via// /dev/vndbinderandroid::ProcessState::initWithDriver("/dev/vndbinder");return defaultPassthroughServiceImplementation<ICameraProvider>("external/0", /*maxThreads*/ 6);
}

注意下面 extern "C" 的声明,确保 C++ 符合没有做 name mangling 处理,保持原样,确保服务进程启动时可以透过 dlsym 获取到 HIDL_FETCH_Interface 并构造服务实例对象,然后向hwservicemanager注册该服务。

同时 CameraProvider 类的实现是一个模板类工厂,根据不同模板参数创建对应的类实例。

hardware/interfaces/camera/provider/2.4/default/CameraProvider_2_4.cpp

Treble 架构下的 Android Camera 框架相关推荐

  1. AndroidO Treble架构下HIDL服务Java框架实现

    https://blog.csdn.net/yangwen123/article/details/79876534 转载于:https://www.cnblogs.com/eustoma/p/1019 ...

  2. Android Camera框架

    总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构, 有两个进程: client 进程,可以看成是 AP 端,主要包括 JAVA 代码与一些 nativ ...

  3. AndroidO Treble架构下Hal进程启动及HIDL服务注册过程

    通过前面对Treble架构的介绍,我们知道,Android Framework进程和Hal分离,每个Hal独立运行在自己的进程地址空间,那么这些Hal进程是如何启动的呢?本文以composer hal ...

  4. AndroidO Treble架构下的变化

    AndroidO引入Treble架构后,有那些变化呢? 1. 增加了多个服务管家,AndroidO之前版本有且只有一个servicemanager,现在增加到3个,他们分管不同的服务. 2.增加了bi ...

  5. 萝卜和青菜--Android camera框架与使用

    Android camera主要结构如图所示. 我们可以从三个层次去使用它:JAVA层,service层和hardwareinterface. 流程都大同小异,不同编程语言具体实现上接口略有不同, 流 ...

  6. AndroidO Treble架构下HIDL服务查询过程

    通过前面的分析我们知道,Hal进程启动时,会向hwservicemanager进程注册hidl服务,那么当Framework Server需要通过hal访问硬件设备时,首先需要查询对应的hidl服务, ...

  7. 13.学习Camera之——Android Treble架构解析

    本文主要介绍Treble架构下的HAL&HIDL&Binder相关技术原理. 1. Treble 简介 Android 8.0 版本的一项新元素是 Project Treble.这是 ...

  8. Android Treble架构解析

    本文主要介绍Treble架构下的HAL&HIDL&Binder相关技术原理.Treble的详细资料文档,请参考Treble 官方文档. 1. Treble 简介 Android 8.0 ...

  9. Android Camera架构浅析

    原址 1.Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转 ...

最新文章

  1. 工作休息之余的生活乐趣
  2. vue.js仿饿了么app---webpack配置项
  3. python高阶函数filter_python 高阶函数之filter
  4. html audio播放本地语音文件,HTML5+ - audio音频播放及网络音频文件播放
  5. 阿里云服务器被挖矿病毒minerd***的解决方法
  6. node11---相册
  7. LazyInitializationException的四种解决方案–第2部分
  8. 电子签名 和 电子证书
  9. python可以连接sql server_python连接sqlserver数据库
  10. java linux root权限管理_Linux--开启root用户并允许管理员登录
  11. python django项目实例_【Django】项目实例
  12. 剑三哪些插件是必备的_日常学习、办公必备的浏览器插件丨附安装教程(三)...
  13. vue学习笔记-2-模板语法中得指令
  14. powerDesign导出word操作步骤
  15. JavaScript 实现 标签页 切换效果
  16. 第十三届蓝桥杯c++b组国赛决赛
  17. 流媒体:依托于声网的连麦解决方案
  18. cocos2d-x3.2与服务端框架Firefly的网络编程(初级网络通讯)
  19. 论文阅读 :A survey of visual analytics techniques for machine learning
  20. 百趣代谢组学资讯:4篇经典案例助力科研不费力,均IF>12

热门文章

  1. [数论][组合数学]微信群
  2. 【高数】高数平面立体几何
  3. K8S之ipvs负载均衡原理
  4. Educational Codeforces Round 115 (Rated for Div. 2) A. Computer Game
  5. AI就业前景越来越严峻了,AI 开发者能怎样提升个人竞争优势?
  6. Python实现屏幕截图的两种方式
  7. 做电商的必须知道的事,线上、线下、海外聚合支付第三方及背景牌照!
  8. 前端Number转千位符以及反转
  9. MUR2060AC-ASEMI快恢复二极管MUR2060AC
  10. Firefox 2.0密码管理Bug会泄漏密码