Treble 架构下的 Android Camera 框架
- Camera 子系统从上到下分别是
App/Framework
,CameraService
,HAL Impl
App/Framework
vsCameraService
之间,通过AIDL
binder 通信CameraService
vsCamera 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
|
|
HAL Impl
Camera Provider 实现
首先,实现 hal 独立运行的进程,并向 hwservicemanager
注册 ICameraProvider
服务,对上层提供硬件功能,包括设备状态信息的查询/更新,获取设备接口以便可以调用设备功能。
AOSP 代码目前有两个 ICameraProvider
服务进程:
legacy/0
, 给内置相机用, 所以目前为止,Camera HALv3 实现还是属于传统 HAL
,参考HAL 类型external/0
, Android P 新增的调用外接 usb 相机的 HAL 服务进程
它们都有对应的启动脚本,在系统启动时加载运行。所以内置相机和外接相机的HAL 实现是分别在两个不同进程里面,各自独立互不影响!
如果需要还可以扩展更多 camera provider,比如 internal
, legacy
, external
, remote
等等,只要具备以下几个条件,cameraservice
就能透过 CameraProviderManager
查询到该服务并查询到 camera 设备列表,供 App Framework
使用该相机设备:
- 启动脚本
- 启动 binary,调用
defaultPassthroughServiceImplementation
注册服务 - manifest camera.provider 节点声明,包括
ßtransport
类型和instance
实例节点名称
进程启动时,会完成这么几件事,跟 hwservicemanager
以及PassthroughServiceManager
的交互通过 binder IPC 调用完成
- 确保
/dev/vndbinder
对应的 binder 服务进程已经启动,如果没有则启动它 - 在该进程里透过
android_dlopen_ext/dlopen
加载对应版本的库,这里是android.hardware.camera.provider@2.4-impl.so
- 透过
dlsym
获取到HIDL_FETCH_ICameraProvider
方法,然后遍历 manifest 里面camera.provider
这个hidl
接口声明的instance
实例名称,作为参数调用该方法, 即可获取到该实例对应的ICameraProvider
实现 - 向 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/0
, external/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 框架相关推荐
- AndroidO Treble架构下HIDL服务Java框架实现
https://blog.csdn.net/yangwen123/article/details/79876534 转载于:https://www.cnblogs.com/eustoma/p/1019 ...
- Android Camera框架
总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构, 有两个进程: client 进程,可以看成是 AP 端,主要包括 JAVA 代码与一些 nativ ...
- AndroidO Treble架构下Hal进程启动及HIDL服务注册过程
通过前面对Treble架构的介绍,我们知道,Android Framework进程和Hal分离,每个Hal独立运行在自己的进程地址空间,那么这些Hal进程是如何启动的呢?本文以composer hal ...
- AndroidO Treble架构下的变化
AndroidO引入Treble架构后,有那些变化呢? 1. 增加了多个服务管家,AndroidO之前版本有且只有一个servicemanager,现在增加到3个,他们分管不同的服务. 2.增加了bi ...
- 萝卜和青菜--Android camera框架与使用
Android camera主要结构如图所示. 我们可以从三个层次去使用它:JAVA层,service层和hardwareinterface. 流程都大同小异,不同编程语言具体实现上接口略有不同, 流 ...
- AndroidO Treble架构下HIDL服务查询过程
通过前面的分析我们知道,Hal进程启动时,会向hwservicemanager进程注册hidl服务,那么当Framework Server需要通过hal访问硬件设备时,首先需要查询对应的hidl服务, ...
- 13.学习Camera之——Android Treble架构解析
本文主要介绍Treble架构下的HAL&HIDL&Binder相关技术原理. 1. Treble 简介 Android 8.0 版本的一项新元素是 Project Treble.这是 ...
- Android Treble架构解析
本文主要介绍Treble架构下的HAL&HIDL&Binder相关技术原理.Treble的详细资料文档,请参考Treble 官方文档. 1. Treble 简介 Android 8.0 ...
- Android Camera架构浅析
原址 1.Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转 ...
最新文章
- 工作休息之余的生活乐趣
- vue.js仿饿了么app---webpack配置项
- python高阶函数filter_python 高阶函数之filter
- html audio播放本地语音文件,HTML5+ - audio音频播放及网络音频文件播放
- 阿里云服务器被挖矿病毒minerd***的解决方法
- node11---相册
- LazyInitializationException的四种解决方案–第2部分
- 电子签名 和 电子证书
- python可以连接sql server_python连接sqlserver数据库
- java linux root权限管理_Linux--开启root用户并允许管理员登录
- python django项目实例_【Django】项目实例
- 剑三哪些插件是必备的_日常学习、办公必备的浏览器插件丨附安装教程(三)...
- vue学习笔记-2-模板语法中得指令
- powerDesign导出word操作步骤
- JavaScript 实现 标签页 切换效果
- 第十三届蓝桥杯c++b组国赛决赛
- 流媒体:依托于声网的连麦解决方案
- cocos2d-x3.2与服务端框架Firefly的网络编程(初级网络通讯)
- 论文阅读 :A survey of visual analytics techniques for machine learning
- 百趣代谢组学资讯:4篇经典案例助力科研不费力,均IF>12
热门文章
- [数论][组合数学]微信群
- 【高数】高数平面立体几何
- K8S之ipvs负载均衡原理
- Educational Codeforces Round 115 (Rated for Div. 2) A. Computer Game
- AI就业前景越来越严峻了,AI 开发者能怎样提升个人竞争优势?
- Python实现屏幕截图的两种方式
- 做电商的必须知道的事,线上、线下、海外聚合支付第三方及背景牌照!
- 前端Number转千位符以及反转
- MUR2060AC-ASEMI快恢复二极管MUR2060AC
- Firefox 2.0密码管理Bug会泄漏密码