文档章节

Android Camera 架构简析2

Jerikc
 Jerikc
发布于 2012/09/03 10:24
字数 1356
阅读 987
收藏 3

l        应用框架层

Camera框架层将应用与底层的实现隔离开来,实现了一套Android定义的对上对下接口规范,方便应用及底层硬件的开发和移植。这一层对上以Java类的形式包装出android.hardware.Camera,提供给应用层调用;对下在CameraHardwareInterface.h头文件中定义了Camera硬件抽象层的接口,这是一个包含纯虚函数的类,必须被实现类继承才能使用。这个实现类也即是下层中将讲到的用户库层,它继承CameraHardwareInterface接口,实例化对底层硬件驱动的封装,最终生成libcamera.so供框架的libcameraservice.so调用。这样做的好处是让Camera的应用框架代码独立,不受底层硬件驱动改变的影响,方便在不同平台上porting 驱动代码,而保持上层的代码不用变化。

从代码上看,这一层包含JavaJNIC++的代码。源代码主要在以下路径:

\android\frameworks\base\core\java\android\hardware\Camera.java

这个类作为Android SDK Camera部分提供给上层应用,并通过JNI的方式调用本地C++代码。

\android\frameworks\base\core\jni\android_hardware_Camera.cpp

Camera JAVA本地调用部分,是承接JAVA代码到C++代码的桥梁。编译生成libandroid_runtime.so

\android\frameworks\base\libs\ui 包含文件:

Camera.cpp

CameraParameters.cpp

ICamera.cpp

ICameraClient.cpp

ICameraService.cpp

它们的头文件在\android\frameworks\base\include\ui目录下。

这部分的内容编译生成libui.so。在Camera模块的各个库中,libui.so位于核心的位置,作为Camera框架的Client客户端部分,与另外一部分内容服务端

libcameraservice.so通过进程间通讯(即Binder机制)的方式进行通讯。

\android\frameworks\base\camera\libcameraservice

CameraServiceCamera服务,Camera框架的中间层,用于链接CameraHardwareInterface Client,它通过调用实际的Camera硬件接口来实现功能。这部分内容被编译成库libcameraservice.so

libandroid_runtime.solibui.so两个库是公用的,其中除了Camera还有其他方面的功能。整个Camera在运行的时候,可以大致上分成ClientServer两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现进程间通讯。这样在client调用接口,功能则在server中实现,但是在client中调用就好像直接调用server中的功能,进程间通讯的部分对上层程序不可见。

以上应用层到框架层的分析可以用下图来表示调用流程。

3. Camera调用流程图

Camera Client端通过Binder机制与Camera Server端通讯,Server端的实现传递到Client端。而Server端的实现又是调用硬件接口来实现。这就延伸到我们要介绍的Camera的下一个层次――库层。

l        库层(硬件抽象层HAL Hardware Abstraction Layer

这个层次其实就是用户空间的驱动代码。前面有介绍过框架层对下在CameraHardwareInterface.h头文件中定义了Camera硬件抽象层的接口,它是包含纯虚函数的类,必须被实现类继承才能使用。HAL层正好继承CameraHardwareInterface接口,依据V4l2规范实例化底层硬件驱动,使用ioctl方式调用驱动,最终生成libcamera.so供框架的libcameraservice.so调用。

这层的代码在\android\hardware\XXX\libcamera目录下(也有可能在vendor目录中对应的libcamera下)。注意这里的XXX是不同厂商为不同产品(板子)而建的目录,以高通msm平台为例,这里XXXmsm7k表示,这样高通msm平台下这个HAL的目录即为\android\hardware\msm7k\libcamera。不难看出,如果要在某硬件平台上运行Android,也就主要在这一层进行修改,因为它是直接和底层硬件驱动相关的。上面也讲过,应用框架层对上对下都定义的标准接口,这样做的目的也就是使上层的代码独立,在porting中不受影响。所以我们现在可以基本确定,如果要改Camera的硬件,框架层以上的部分都可以不动,要改就改HAL到内核层的部分,这也是Android底层开发的主要工作。这个在后续的文章中会具体介绍。

l        内核层

          这一层主要是基于Linux的设备驱动。对Camera来说,一般是按V4l2规范将Camera原子功能以ioctl的形式暴露出来供HAL层调用的实现。主要功能的实现代码在\android\kernel\drivers\media\video\XXX下。跟HAL层目录一样,XXX是不同厂商不同平台的目录,以高通msm平台为例,这个目录就是\android\kernel\drivers\media\video\msm。所以要在Android平台上添加硬件功能,首先考虑将它的驱动加到AndroidLinux内核中。

后记

      至此,已将Camera各层在Android中的分布做了简单介绍。依此类推,Android上其他模块也跟Camera一样有类似的结构分层,如MediaPlayer。在了解了这样的结构后,对我们开发有一定的指导意义,使我们清楚如果对已有模块的功能添加和修改一般应在哪些个层次进行,哪些代码不用改,哪些代码要改。

      鉴于本人水平有限,如有写的错误或不周全的地方,请包含。

本文转载自:http://rnmichelle.blog.51cto.com/2729211/491755

Jerikc
粉丝 98
博文 246
码字总数 22757
作品 0
浦东
程序员
私信 提问
Android Camera 架构简析1

前言 最近整体看了一下Android Camera 部分代码,从Framework的Camera 应用框架到 Hardware的Camera HAL 再到 Kernel的 Camera Driver。把对Camera部分的学习整理成笔记,方便理解。 2. 概述...

Jerikc
2012/09/03
0
0
[Android O] Camera 服务启动流程简析

前言 去年正式进入框架组的时候,啥也不会,瞎jb分析了一通 Android N 上面的 Camera 相关流程。其实基本上都是跟着别人的分析日志看代码,然后按照自己的理解记了些笔记而已。 不过当时感觉...

天王盖地虎626
02/19
0
0
Android Camera模块解析之视频录制

《Android Camera架构》 《Android Camera进程间通信类总结》 《Android Camera模块解析之拍照》 《Android Camera模块解析之视频录制》 《Android Camera原理之CameraDeviceCallbacks回调模...

天王盖地虎626
06/18
0
0
分享20个使用方便的免费智能手机UI套件

还记得上次我们分享的超炫的iphone应用UI/UX设计赏析吧,在今天的UI分享中,我们将介绍40款超棒的免费智能手机UI界面设计,如果你从事智能手机界面开发和设计的话,这套免费UI绝对不容错过,...

gbin1
2012/11/15
3.6K
13
Android Camera进程间通信类总结

《Android Camera架构》 《Android Camera进程间通信类总结》 《Android Camera模块解析之拍照》 《Android Camera模块解析之视频录制》 《Android Camera原理之CameraDeviceCallbacks回调模...

天王盖地虎626
07/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Protocol Buffers 简介

文档编辑和持续集成状态: 本文档的 Protocol Buffer 的中文文档使用的是 Asciidoctor 进行编排的 http://docs.ossez.com/protocol-buffers-docs/index.html(本 WIKI 中的内容将会与在线发布...

honeymoose
今天
3
0
uniapp + bootstrapvue 移动/PC 一套搞定 (一)配置bootstrapvue

1.准备文件 自己到DCloud官网: http://dcloud.io/ 去下载官方的IDE Hbuilder,新建一个空的uniapp项目即可。 uniapp框架自带优化的vue,我们仅仅需要准备以下三个文件: bootstrap.min.css ...

panyunxing
今天
11
0
Android Camera原理之camera service类与接口关系

camera service主要是指 frameworks/av/services/camera/下面的代码,最近在看这一块的代码,为了更好地理清这一块的代码,也为了后续学习camera方便一些,我觉得很有必要理一下这一块的整体...

天王盖地虎626
今天
6
0
Golang学习笔记

[TOC] Golang学习笔记 这个学习笔记是最早在1.初,版本左右的时候写的,和当前最新的版本可能会有较大的差异. 因为成文比较早,文章里面又有很多自己的见解,有些东西当时理解的不太透彻可能写错...

我爱吃炒鸡
今天
18
0
科技赋能成效显著!金融壹账通两大赋能项目荣获IDC大奖

7月19日,2019IDC中国未来金融论坛曁颁奖典礼于北京举办。由金融壹账通赋能的长春农商银行多人视频面审智能风控系统、包头农商银行互联网银行SaaS服务两大项目因在项目的创新性、技术领先性、...

IFTNews
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部