Android下Camera框架解析

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android 下Camera 构架分析

一. Android Camera 层次结构

Android 下Camera 子系统从上到下可以分为应用层、框架层、运行库层及内核层,其结构如下图所示。从整体上看,它还是属于Android 下典型的client/service 的结构,运行在两个进程中,一个是client 进程,主要包括JA V A 代码与一些Native c/c++代码;另一个是service 进程,属于服务端,是native c/c++代码,并且,camera service 属于Android 系统的一个native 服务,用native c/c++代码实现,主要负责和Linux kernel 中的Camera Driver 交互,搜集Linux kernel 中Camera Driver 上传的数据,并交给显示系统(surface)显示。

client 进程与service 进程通过Binder 机制通信,client 端通过调用service 端的接口实现各个具体的功能。但真正的preview 数据不会通过Binder IPC 机制从service 端复制到client 端,而是通过回调函数与消息的机制将preview 数据buffer 的地址传到client 端,最终可在Java 应用中操作处理这个preview 数据。 android_hardware.camera

Camera Apps Libandroid_runtime.so (android_hardware_Camera.cpp)

libcamera_client.so (Camara.cpp)

应用层框架层运行库层

硬件层

Libcamera.so (HAL)libcameraservice.so (CameraService.cpp)Linux 内核层

V4L2 Kernel Driver Camera Hardware BinderIPC

JNI

Client Service

二. Android Camera 的代码结构

1)应用层

Camera 的应用层在Android 上表现为直接调用SDK API 开发的一个

Camera应用APK包,代码在/android/packages/apps/Camera下,其主要作用是对android.hardware.Camer(frameworks/base/core/java/android/hardware/Camera.java)类的调用,并且实现Camera 应用的业务逻辑和UI 显示。

2)框架层

框架层包含了camera的JNI实现,Camera Client和Service三部分。其中,JNI提供接口给上层JA V A代码(android.hardware.Camer类)调用,文件路径为:frameworks/base/core/jni/android_hardware_Camera.cpp,这部分内容编译成为目标libandroid_runtime.so。Camera Client实现的代码在frameworks/av/camera/下,这部分的内容被编译成库libcamera_client.so,主要实现了以下几个类:

Camera--->Camera.cpp/Camera.h

CameraParameters---->CameraParameters.cpp/CameraParameters.h

ICamera----> ICamera.cpp/ ICamera.h

ICameraClient----> ICameraClient.cpp/ ICameraClient.h

ICameraService---> ICameraService.cpp/ ICameraService.h

ICamera、ICameraClient、ICameraServide三个类是按照Binder IPC通信要求的框架实现的,用来与service端通信。类CameraParameters接收Framework层的android.hardware.camera::Parameters类为参数,解析与格式化所有的参数配置。Camera是个很重要的类,它与Camera Service端通过Binder IPC机制交互来实现具体功能。Camera继承自BnCameraClient,并最终继承自ICameraClient。

Camera Service文件分布在frameworks/av/services/camera/libcameraservice/,这部分内容被编译成库libcameraservice.so, libcameraservice.so是Camera的服务器程序,它通过继承libcamera_client.so的类实现服务器的功能,并且与libcamera_client.so中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。里面主要实现了两个类:

CameraService---->BnCameraService---->ICameraService

CameraService::Client---->BnCamera---->ICamera

CameraService::Client通过调用CameraHardwareInterface类来实现具体的功能,CameraHardwareInterface直接与camera HAL层交互。

3)HAL层

Camera HAL一般实现为一个动态库libcamera.so(动态库的名字可以修改,只需要与android.mk一致即可)。所有java应用层中camera的功能最终会调用到HAL层这里,Camera HAL层的实现依赖于硬件,在这些头文件Camera.h提供了对上层的接口,而其他的几个头文件都是提供一些接口类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。

一般通过V4L2 command从linux kernel中的camera driver获得preview数据,然后交给surface(overlay)显示或者保存为文件。在HAL层需要打开对应的设备文件,并通过ioctrl访问camera driver。Android通过这个HAL层来保证底层硬件(驱动)改变,只需修改对应的HAL层代码,FrameWork层与JA V A AP层都不用改变。

相关文档
最新文档