AndroidCamera架构分析_第1页
AndroidCamera架构分析_第2页
AndroidCamera架构分析_第3页
AndroidCamera架构分析_第4页
AndroidCamera架构分析_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android的Camera架构一AndroidCamera框架要了解AndroidCamera架构,还是得先从Android本身的架构说起。ApplicationDialer灯AlnriMeHcfrDidMkdiqPiy针PhfftcAlbtrnOo6cApplicaiidnFrameworkActtvryMimgcrW;ndcwMxruq尸CsmTntProwlden储SyitBTSN5dficixionManserIclcjhofijfM争的,广k.t*4urc«Mart岑Lecitbnh.LiRRAIFSAndroidRuntime即ArMMLbnritq力E臼岛第Hardw

2、areA日stracti口7LhAyerG"dpliikiAudkfCdJiFn1BluwdiQFjfRFL)W行LinuxKernelDpayDffverCameriDriverBuecoodiDrawerShRirdMwflryDhintrBrdarflPC)DrMrA.dknPaWEfIJDrrerKeypadDtkfWifiDiri*EirDwers图1AndroidArchitecture从Android框架看,分为四层:应用层、应用框架层、库层、内核层。应用层主要工作在AndroidSDK之上,利用Android提供的API进行开发,生成APK包。应用框架层整合了Andr

3、oid自带各种控件和类,为应用开发提供高效、方便的API接口。这个对上实现统一的接口,对下也提供统一的标准方便各种库的移入。库层是Android与底层硬件通信接口,它封装底层硬件接口实现该模块的具体逻辑,并以服务的形式通过Binder通讯机制暴露给应用框架。内核层则是直接与硬件联系的一层,可以理解为设备驱动。通过对上面框架的简要说明,我们大致明白一个应用自上而下的各个层起什么作用,这样有助于我们对代码的理解和修改。如果要彳基于Androidporting工作,就要明白在哪个层次的porting,怎么porting。Android的Camera包含取景器(viewfinder)和拍摄照片(tak

4、epicture)的功能。目前Android原生的Camera程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。Android中的Camera模块同样遵循Android的框架,如下图所示。jndriid-hurdn/科(通incT专AdHTu*i.ihJh.atFJpjkf'JmVT(jHHnjMrfllibindroklFrameworksruiiriinK'.MiLlflerlihhnnm-qnmc-ra-lut-wIJbrariesApplicationKernel图2CameraArchitect

5、ure二AndroidCamera架构分层及代码结构以开源的Android为例,Camera架构主要分为以下几个层次2.1 应用层Camera的JAVA应用程序的路径:packages/apps/Camera/src/com/android/camera/在其中Camera.java是主要实现的文件2.2 JNI层(Camera的JAW本地调用部分):frameworks/base/core/java/android/hardware/Camera.java这个类是和JNI中定义的类是同一个,有些native方法通过JNI的方式调用Native代码实现具体的功能,比如startPreview、

6、autoFocus、takePicture等。2.3 Cameraclient层:头文件分布以下的目录中:frameworks/base/include/camera/Camera底层库在以下的目录中:frameworks/base/libs/camera/这部分的内容被编译成库libcamera_client.so(或者libui.so),主要实现了以下几个类:Camera>Camera.cpp/Camera.hCameraParameters>CameraParameters.cpp/CameraParameters.hICamera->ICamera.cpp/ICame

7、ra.hICameraClient>ICameraClient.cpp/ICameraClient.hICameraService->ICameraService.cpp/ICameraService.hICamera、ICameraClient、ICameraServide三个类是按照BinderIPC通信要求的框架实现的,用来与service端通信。类CameraParameters接收Framework层的android.hardware.camera:Parameters类为参数,解析与格式化所有的参数配置。Camera是个很重要的类,它与CameraService端通过B

8、inderIPC机制交互来实现具体功能。Cametra继承自BnCameraClient,并最终继承自ICameraClient.2.4 CameraService层文件分布在frameworks/base/camera/libcameraservice/这部分内容被编译成库libcameraservice.so,libcameraservice.so是Camera的服务器程序,它通过继承libcamera_client.so的类实现服务器的功能,并且与libcamera_client.so中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。里面主要实现了两个类:Camer

9、aService>BnCameraService>ICameraServiceCameraService:Client>BnCamera>ICameraCameraService::Client通过调用CameraHAL层来实现具体的功能。2.5 HAL层Libcameraservice.so:CameraService:Client类调用CameraHAL的代码实现具体的功能,CameraHAL一般实现为一个动态库libcamera.so(动态库的名字可以修改,只需要与android.mk一致即可)。所有java应用层中camera的功能最终会调用到HAL层这里,Ca

10、meraHAL层的实现依赖于硬件,一般通过V4L2command从linuxkernel中的cameradriver获彳导preview数据,然后交给surface(overlay)显示或者保存为文件。在HAL层需要打开对应的设备文件,并通过ioctrl访问cameradriveroAndroid通过这个HAL层来保证底层硬件(驱动)改变,只需修改对应的HAL层代码,FrameWork层与JAVAAP层都不用改变。2.6 Camera库文件分析前面已提至UCamera模块主要包含libandroid_runtime.so、libcamera_client.s0(libui.so)、libcam

11、eraservice.so和一个与Camera硬件相关的硬件库libcamera.so。其中libandroid_runtime.so、libcamera_client.s0(libui.so)是与android系统构架相关的,不需要对进行其彳改,libameraservice.s。和libcamera.so则是和硬件设备相关联的,而cameralib.s。实际上就是设备的linxu驱动,所以Camera设备的系统继承主要是通过移植CameraLinux驱动和修改libcameraservice.so库来完成。Libcameraservice.so构建规则中使用宏USE_CAMERA_STUB

12、决定是否使用真的Camera,如果宏为真,贝U使用CameraHardwareStub.cpp和FakeCamera.cpp构造一个假的Camera,如果为假则使用libcamera来构造一个实际上的Camera服务。在CameraHardwareStub.cpp中定义了CameraHardwareStub类,它继承并实现了抽象类CameraHardwareInterface中定义的真正操作Camera设备的所有的纯虚函数。通过openCameraHardware()将返回个CameraHardwareInterface类的对象,但由于CameraHardwareInterface类是抽象类所

13、以它并不能创建对象,而它的派生类CameraHardwareStub完全实现了其父类的纯虚函数所以openCameraHardware。返回一个指向派生类对象的基类指针用于底层设备的操作。由于CameraHardwareStub类定义的函数是去操作一个假的Camera,故通过openCameraHardware返回的指针主要用于仿真环境对Camera的模拟操作,要想通过openCameraHardware返回的指针操作真正的硬件设备则需完成以下步骤:(1) CameraHardwareInterface类中的所有纯虚函数的声明改为虚函数的声明(即去掉虚函数声明后的“=0”);(2编写一个源文件

14、去定义CameraHardwareInterface类中声明的所有虚函数;编写Android.mk文件用于生成一个包含步骤编写的源文件和其他相关文件的libcamera.so文件;将宏USE_CAMERA_STUB改成false,这样生成libcameraservice.so时就会包含libcamera.so库。(注:如果CameraHardwareInterface类的成员函数并没有直接操作硬件而是调用Camera的linux驱动来间接对硬件操作,那么包含这样的类的libcamera.so库就相当于一个HAL)。三Camera的架构和代码分析3.1 Camera的整体框架图Camera的各个

15、库之间的结构可以用下图的表示:IIHr.III':|."I.LMJ!k'tI(IMF堆力Wirw*vvv-v.图3库结构图在Camera系统的各个库中,libui.so位于核心的位置,它对上层的提供的接口主要是Camera类,类libandroid_runtime.so通过调用Camera类提供对JAVA的接口,并且实现了android.hardware.camera类。libcameraservice.so是Camera的服务器程序,它通过继承libcamera_client.so(libui.so)的类实现服务器的功能,并且与libcamera_client.so

16、(libui.so)中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。libandroid_runtime.so和libcamera_client.so(libui.so)两个库是公用的,其中除了Camera还有其他方面的功能。Camera部分的头文件在frameworks/base/include/ui/目录中,这个目录是和libmedia.so库源文件的目录frameworks/base/libs/ui/相对应的。Camera主要的头文件有以下几个:ICameraClient.hCamera.hICamera.hICameraService.hCameraHardwa

17、relnterface.h'<i!Z.jfriMvnClientServer图4Camera类图在这些头文件Camera.h提供了对上层的接口,而其他的几个头文件都是提供一些接口类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。整个Camera在运行的时候,可以大致上分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现进程间通讯。这样在客户端调用接口,功能则在服务器中实现,但是在客户端中调用就好像直接调用服务器中的功能,进程间通讯的部分对上层程序不可见。从框架结构上来看,ICameraService.h、ICamera

18、Client.h和ICamera.h三个类定义了MeidaPlayer的接口和架构,ICameraService.cpp和Camera.cpp两个文件用于Camera架构的实现,Camera的具体功能在下层调用硬件相关的接口来实现。从Camera的整体结构上,类Camera是整个系统核心,ICamera类提供了Camera主要功能的接口,在客户端方面调用,CameraService是Camera服务,它通过调用实际的Camera硬件接口来实现功能。事实上,图中红色虚线框的部分都是Camera程序的框架部分,它主要利用了Android的系统的Binder机制来完成通讯。蓝色的部分通过调用Came

19、ra硬件相关的接口完成具体的Camera服务功能,其它的部分是为上层的JAVA程序提供JNI接口。在Android的整体结构上,左边可以视为一个客户端,右边是一个可以视为服务器,二者通过Binder来实现进程间的通讯。3.2 头文件ICameraClient.hICameraClient.h用于描述一个Camera客户端的接口,定义如下所示:classICameraClient:publicIlnterface(public:DECLARE_META_INTERFACE(CameraClient);virtualvoidshutterCallback()=0;virtualvoidrawCal

20、lback(constsp<IMemory>&picture)=0;virtualvoidjpegCallback(constsp<IMemory>&picture)=0;virtualvoidframeCallback(constsp<IMemory>&frame)=0;virtualvoiderrorCallback(status_terror)=0;virtualvoidautoFocusCallback(boolfocused)=0;classBnCameraClient:publicBnInterface<ICamer

21、aClient>(public:virtualstatus_tonTransact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags=0);在定义中,ICameraClient类继承IInterface,并定义了一个Camera客户端的接口,BnCameraClient继承了BnInterface<ICameraClient>,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。根据BnInterface类模版的定义BnInterface<ICameraClient>类相当

22、于双继承了BnInterface和ICameraClient。IcameraClient这个类的主要接口是几个回调函数shutterCallback、rawCallback和jpegCallback等,它们在相应动作发生的时候被调用。作为Camera的客户端”,需要自己实现几个回调函数,让服务器程序去间接地”调用它们。3.3 头文件Camera.hCamera.h是Camera对外的接口头文件,它被实现CameraJNI的文件android_hardware_Camera.cpp所调用。Camera.h最主要是定义了一个Camera类:classCamera:publicBnCameraCli

23、ent,publicIBinder:DeathRecipientpublic:staticsp<Camera>connect。;Camera();voiddisconnect。;statustgetStatus()returnmStatus;statustsetPreviewDisplay(constsp<Surface>&surface);statuststartPreview();voidstopPreview();statustautoFocus();statusttakePicture();statustsetParameters(constString

24、8&params);voidString8voidvoidvoidvoidvoidgetParameters()const;setShutterCallback(shutter_callbackcb,void*cookie);setRawCallback(frame_callbackcb,void*cookie);setJpegCallback(frame_callbackcb,void*cookie);setFrameCallback(frame_callbackcb,void*cookie);setErrorCallback(error_callbackcb,void*cookie

25、);setAutoFocusCallback(autofocus_callbackcb,void*cookie);/ICameraClientinterfacevirtualvoidshutterCallback();virtualvoidrawCallback(constsp<IMemory>&picture);virtualvoidjpegCallback(constsp<IMemory>&picture);virtualvoidframeCallback(constsp<IMemory>&frame);virtualvoider

26、rorCallback(status_terror);virtualvoidautoFocusCallback(boolfocused);/)从接口中可以看出Camera类刚好实现了一个Camera的基本操作,例如播放(startPreview)、停止(stopPreview)、暂停(takePicture)等。在Camera类中connect。是一个静态函数,它用于得到一个Camera的实例。在这个类中,具有设置回调函数的几个函数:setShutterCallback、setRawCallback和setJpegCallback等,这几个函数是为了提供给上层使用,上层利用这几个设置回调函数,

27、这些回调函数在相应的回调函数中调用,例如使用setShutterCallback设置的回调函数指针被shutterCallback所调用。在定义中,ICameraClient类双继承了IInterface和IBinder:DeathRecipient,并定义了一个Camera客户端的接口,BnCameraClient继承了BnInterface<ICameraClient>,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。事实上,根据BnInterface类模版的定义BnInterface<ICameraClient>类相当于双继承了BnInte

28、rface和ICameraClient。这是Android一种常用的定义方式。继承了DeathNotifier类之后,这样当这个类作为IBinder使用的时候,当这个BinderIP将Died的时候被调用其中的binderDied函数。继承这个类基本上实现了一个回调函数的功3.4 头文件ICamera.hICamera.h描述的内容是一个实现Camera功能的接口,其定义如下所示:classICamera:publicIInterfacepublic:DECLARE_META_INTERFACE(Camera);virtualvoiddisconnect()=0;virtualstatusts

29、etPreviewDisplay(constsp<ISurface>&surface)=0;virtualvoidsetHasFrameCallback(boolinstalled)=0;virtualstatuststartPreview()=0;virtualvoidstopPreview()=0;virtualstatustautoFocus()=0;virtualstatusttakePicture()=0;virtualstatustvirtualString8setParameters(constString8&params)=0;getParamete

30、rs()const=0;);classBnCamera:publicBnInterface<ICamera>(public:virtualstatus_tonTransact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags=0););ICamera.h描述的内容是一个实现Camera功能的接口,其定义如下所示:值得注在camera类中,主要定义Camera的功能接口,这个类必须被继承才能够使用。意的是,这些接口和Camera类的接口有些类似,但是它们并没有直接的关系。事实上,在Camera类的各种实现中,一般

31、都会通过调用ICamera类的实现类来完成。3.5 头文件ICameraService.hICameraService.h用于描述一个Camera的服务,定义方式如下所示:classICameraService:publicIInterface(public:DECLARE_META_INTERFACE(CameraService);virtualsp<ICamera>connect(constsp<ICameraClient>&cameraClient)=0;);classBnCameraService:publicBnInterface<ICameraService>(public:virtualstatus_tonTransact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags=0););由于具有纯虚函数,ICameraService以及BnCameraService必须被继承实现才能够使用,在ICameraService只定义了一个connect。接口,它的返回值的类型是sp<ICamera>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论