AndroidCamera系统的结构简析及移植初探

时间:2022-09-30 08:31:15

AndroidCamera系统的结构简析及移植初探

摘要:目前对于各类Android系统设备,都要求具备照相拍摄功能。考虑到平台的多样性和设备型号的差异,需要开展相应的Camera系统的移植工作。在理解Android系统结构的基础上,分析了Camera在Android系统中各个层次结构上的实现方式,进而阐明了在进行Camera移植时所需完成的主要工作内容。

关键词:Android系统;Camera组件;系统移植

中图分类号:TP316 文献标识码:A 文章编号:1009-3044(2013)09-2100-02

1 概述

目前Android系统由于其系统的开放性、强大的多媒体能力、无需许可费用等等显著的特点,在各类移动设备与嵌入式设备中得到极为广泛的使用,得到业界各大开发团队,顶尖IT公司的广泛支持。具备照相和视频拍摄功能是这些移动设备、多媒体设备的一个基本要求,因此对原生Android系统,针对不同的开发平台、不同的厂商产品来进行有针对性的移植,是有着积极的实践意义的。

2 Android结构分析

目前在移动设备中广泛使用的Android系统,从逻辑结构上可以分为应用层、应用框架层、库层、内核层这个四个层次。

应用层的应用程序通常是指用户界面这个层面的程序,使用Android提供的API进行开发,通常用java程序编写,再加上各种资源文件。Java源程序和资源文件共同编译生成APK包。当然Android系统本身也提供了一些最基本的核心应用。

应用框架层为应用软件开发者提供上述提到的API,本质上,这是应用程序的框架。在这个框架内部,提供了UI界面所需要的各种控件,比如网格、列表等,为开发应用软件提供了必要的编程接口。另外在应用框架层中也需要按照统一的标准接入下一个层次库层中的内容。

库层对于嵌入式系统来说,占据一个中间件层次的位置,是Android应用层与实际硬件进行相互通信的一个接口,把硬件的行为和功能封装起来,然后应用框架层再通过某种通信途径与库层进行通信。具体说来,该层次包含两个部分,一个是各种库,另外一个是Android的运行环境(RunTime),这些库通常是用C++语言实现的,包含C标准库、多媒体框架、图形引擎、嵌入式数据库等等部分。

内核层又称之为操作系统层,使用标准的Linux2.6内核,是直接与硬件联系的一层。考虑到Android系统的主要应用范围,这个层次主要包含一些与移动设备相关设备驱动程序。

3 Camera各层次的实现方式剖析

在分析上述Android整体框架基础上,进一步分析Camera系统的具体实现方式。

3.1 应用层实现

Camera系统在应用层上是以一个APK包的直观形式表现出来的,当然在这个APK包的开发过程中调用了大量框架层中的API函数,能够实现Camera应用的业务逻辑和UI显示,路径在/android/packages/apps/Camera下,主要实现文件是Camera.java,对应的Java层次的类是android.hardware.Camera。这个类就是Android提供给上层调用的Camera类。这个类的具体作用是用来连接与断开下层中Camera服务,对拍摄的参数或者模式进行设置,打开关闭画面预览,开启拍照动作,实现自动对焦等。它也是Android Camera应用框架封装暴露出来的接口。不过需要注意的是如果要在一个实际的Android应用程序中使用Camera类,必须在源代码中声明Camera的权限与特性。

3.2 应用框架层实现

Camera框架层将应用与底层的实现隔离开来,实现了一套Android定义的对上对下接口规范,方便应用及底层硬件的开发和移植。这一层对上以Java类的形式包装出android.hardware.Camera,以便应用层软件进行调用;对下则在一个文件名为CameraHardwareInterface.h头文件中规定出Camera硬件抽象层的接口。注意这个接口类内定义了纯虚函数,虚函数必须被实现类继承以后才能使用。实际上这个实现类就是在上文所提到的Android框架里的库层,这个库层作用是继承CameraHardwareInterface接口,将处于最底层的硬件驱动加以实例化,生成libcamera.so让应用框架的libcameraservice.so进行调用。通过这种处理方式,使得让Camera的应用框架代码保持独立性,不会受到具体硬件型号和参数的影响,为在不同的平台上移植Android系统提供了极大的方便。

在这个层次中,代码经历了从Java到JNI再到C++的多次转换。Camera.java源文件中的类作为Android SDK中有关Camera的一个组成部分提供给上层应用程序调用,并进一步通过本地调用方式(即JNI方式)调用本地C++代码。相关cpp文件名是android_hardware_Camera.cpp,这个文件是实现JAVA代码到C++代码的转换的基本路径,并且进一步编译为libandroid_runtime.so文件。

在Android系统的/android/frameworks/base/libs/ui中包含多个cpp源文件,这些源文件会最终编译生成libui.so。这个文件在Camera占有极其重要的地位,是一个核心文件。基本作用体现为作为Camera应用框架的Client客户端,与作为服务端的libcameraservice.so通过Binder机制进行进程之间的通讯,即IPC通信。作为Camera服务载体libcameraservice.so是通过调用Camera hardware interface接口功能完成上述的客户端连接。

在上述过程中,libandroid_runtime.so和libui.so是两个公用库,Android系统中的其他一些组件可能也会调用这两个文件。在Camera系统工作的时候,客户端与服务器端分别在两个进程中运行,借助于Binder机制实现进程之间通讯。不过需要指出的是这种进程之间的通讯对于上层应用程序来说是透明的,上层应用程序无需关心功能究竟是在客户端还是在服务端实现的。总而言之,当Camera 客户端通过Binder机制与服务端通讯,由服务端实现后传递到客户端。而服务端的实现又是调用camera硬件接口实现的。

3.3 库层实现

在camera系统中,库层实际上就是硬件抽象层(HAL层),用户空间的驱动代码就是在这个层次中。在库层的上级层次框架层中,包含了 Camera硬件抽象层的接口,这些接口是包含纯虚函数的类。那么在库层或者硬件抽象层中将会依据Linux中V4L2标准规范对底层硬件驱动进行实例化,最终生成libcamera.so以便应用框架的libcameraservice.so服务进行调用。具体代码所在的目录根据开发板或者厂家的不同也稍显有些区别,通常是在/android/hardware/XXX/libcamera目录下。例如对于三星S3C平台,这里的XXX用s3c表示。

3.4 内核层实现

由于Android系统本身是架构在Linux内核上的开源操作系统,因此驱动层实质上就是Linux的内核,只不过针对移动设备的特点做了一些优化而已。对于Android中Camera系统,通常是依据V4L2驱动规范以ioctl的形式将Camera基本物理功能提供给硬件抽象层调用。主要功能包含图像视频数据的采集、格式转换、图片缩放、数据传输。其中V4L2是V4L的升级版,全称为视频设备的通用驱动接口,Android系统中的Camera功能实现的基础就是这套标准的驱动架构。当视频设备加载成功后,会相应的在/dev目录下面生成设备节点。

4 Camera系统移植的主要内容

由上所知,在camera系统中,Camera本地框架、Camera服务、Camera硬件接口都是采用标准化接口,代码相对独立,在移植过程中无需作出改变。因此对于Camera系统的移植,主要有两方面的内容:一是Camera硬件抽象层的修改,这个层次是直接和底层硬件驱动紧密相关的,是V4L2与Camera服务之间的一个接口,是一个C++的标准类,一个具体的实现者将会继承这个类。Camera的硬件抽象层需要具备提取景物、视频摄录、照片捕捉等功能。二是Camera驱动程序的修改。在Linux系统中,采用标准的Video for Linux 2作为标准的Camera驱动,并且定义了内核空间及用户空间中的数据类和控制类。在移植Android系统中的Camera系统的时候,仍然可以采用V4L2作为Camera的驱动程序。综上所述,如果Android系统中的Camera硬件发生变化了,对于相应的移植工作,主要的工作就是硬件抽象层到内核层这一部分,应用框架层以上的部分无需作出变动。当然在具体进行移植时,由于硬件平台、Camera硬件型号的差异,实际的代码修改,参数配置还会有所差异。

参考文献:

[1] 李骏.Android驱动开发与移植实战讲解[M].北京:人民邮电出版社,2012.

[2] 扶松柏.安卓开发从入门到精通[M].北京:兵器工业出版社,2012.

上一篇:常用排序算法的比较与分析 下一篇:任务栏“合身”才最好