没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Android Camera架构及应用简析:目前对于各类Android系统设备,都要求具备照相拍摄功能。考虑到平台的多样性和设备型号的差异,需要开展相应的Camera系统的移植工作。在理解Android系统结构的基础上,分析了Camera在Android系统中各个层次结构上的实现方式,进而阐明了在进行Camera移植时所需完成的主要工作内容。
资源推荐
资源详情
资源评论











Android Camera 架构及应用简析
1. 前言
整体看一下 Android Camera 部分的代码,从 APP 层的 Camera 到 Framework 的
Camera 应用框架,再到 Hardware 的 Camera HAL , 再到 Kernel 的 Camera
Driver。
2. 架构概述
要了解 Android Camera 架构,还是得先从 Android 本身的架构说起。
图 1 Android 架构图
从 Android 框架看,分为四层:应用层、应用框架层、库层、内核层。
应用层主要工作在 Android SDK 之上,利用 Android 提供的 API 进行开发,生成
APK 包。
应用框架层整合了 Android 自带各种控件和类,为应用开发提供高效、方便的 API 接
口。这个对上实现统一的接口,对下也提供统一的标准方便各种库的移入。
库层是 Android 与底层硬件通信接口,它封装底层硬件接口实现该模块的具体逻辑,
并以服务的形式通过 Binder 通讯机制暴露给应用框架。
内核层则是直接与硬件联系的一层,可以理解为设备驱动。

3. Camera 层次简析
说完 Android 整体框架,我们以 Camera 为例来说明一下 Camera 在各层是如何实现。
下图是 Camera 部分在 Android 上各层的分布图
图 2 Camera 结构分布图
➢ 3.1 应用层
Camera 的应用层在 Android 上表现为直接调用 SDK API 开发的一个 Camera 应用
APK 包。代码在\android\packages\apps\Camera 下。主要是 Java 写的基于
android.hardware.Camera 类调用的封装,并且实现 Camera 应用的业务逻辑和 UI 显
示。android.hardware.Camera 就是 Android 提供给上层调用的 Camera 类。这个类
用来连接或断开一个 Camera 服务,设置拍摄参数,开始、停止预览,拍照等。它也是
Android Camera 应用框架封装暴露出来的接口。一个 Android 应用中若要使用这个类,
需要在 Manifest 文件声明 Camera 的权限,另外还需要添加一些<uses-feature>元素
来声明应用中的 Camera 特性,如自动对焦等。具体做法可如下:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
➢ 3.2 应用框架层
Camera 框架层将应用与底层的实现隔离开来,实现了一套 Android 定义的对上对下
接口规范,方便应用及底层硬件的开发和移植。这一层对上以 Java 类的形式包装出
android.hardware.Camera,提供给应用层调用;对下在

CameraHardwareInterface.h 头文件中定义了 Camera 硬件抽象层的接口,这是一个
包含纯虚函数的类,必须被实现类继承才能使用。这个实现类也即是下层中将讲到的用户库
层,它继承 CameraHardwareInterface 接口,实例化对底层硬件驱动的封装,最终生成
libcamera.so 供框架的 libcameraservice.so 调用。这样做的好处是让 Camera 的应用
框架代码独立,不受底层硬件驱动改变的影响,方便在不同平台上 porting 驱动代码,而
保持上层的代码不用变化。
从代码上看,这一层包含 Java 到 JNI 到 C++的代码。
\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\services\camera\libcameraservice
CameraService 是 Camera 服务,Camera 框架的中间层,用于链接
CameraHardwareInterface 和 Client,它通过调用实际的 Camera 硬件接口来实现功
能。这部分内容被编译成库 libcameraservice.so。
libandroid_runtime.so 和 libui.so 两个库是公用的,其中除了 Camera 还有其他方面的功
能。
以上应用层到框架层的分析可以用下图来表示调用流程。

图 3 Camera 调用流程图
在 Camera 系统的各个库中,libui.so 位于核心的位置,它对上层的提供的接口主要是 Camera 类,类
libandroid_runtime.so 通过调用 Camera 类提供对 JAVA 的接口,并且实现了
android.hardware.camera 类。
libcameraservice.so 是 Camera 的服务器程序,它通过继承 libui.so 的类实现服务器的功
能,并且与 libui.so 中的另外一部分内容则通过进程间通讯(即 Binder 机制)的方式进行通讯。
libandroid_runtime.so 和 libui.so 两个库是公用的,其中除了 Camera 还有其他方面的功
能。
Camera 部分的头文件在 frameworks/base/include/ui/目录中,这个目录是和
libmedia.so 库源文件的目录 frameworks/base/libs/ui/相对应的。
整个 Camera 在运行的时候,可以大致上分成 Client 和 Server 两个部分,它们分别
在两个进程中运行,它们之间使用 Binder 机制实现进程间通讯。这样在 client 调用接口,
功能则在 server 中实现,但是在 client 中调用就好像直接调用 server 中的功能,进程间
通讯的部分对上层程序不可见。
当 Camera Client 端通过 Binder 机制与 Camera Server 端通讯,Server 端的实
现传递到 Client 端。而 Server 端的实现又是调用硬件接口来实现。这就延伸到
Camera ――的下一个层次 库层。
➢ 3.3 库层(硬件抽象层 HAL Hardware Abstraction Layer)
这个层次其实就是用户空间的驱动代码。前面有介绍过框架层,对下在
CameraHardwareInterface.h 头文件中定义了 Camera 硬件抽象层的接口,它是包含
纯虚函数的类,必须被实现类继承才能使用。HAL 层正好继承
CameraHardwareInterface 接口,依据 V4l2 规范实例化底层硬件驱动,使用 ioctl 方
式调用驱动,最终生成 libcamera.so 供框架的 libcameraservice.so 调用。
这层的代码在\android\hardware\XXX\libcamera 目录下(也有可能在 vendor 目
录中对应的 libcamera 下)。注意这里的 XXX 是不同厂商为不同产品(板子)而建的目录,
以高通 msm 平台为例,这里 XXX 用 msm7k 表示,这样高通 msm 平台下这个 HAL 的目
剩余15页未读,继续阅读
资源评论


dcneo
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
