Android下Camera框架解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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层都不用改变。