一.应用层

Camera的应用层在Android上表现为直接调用SDK API开发的一个Camera应用APK包。代码在/android/packages/apps/Camera下。主要对 android.hardware.Camera(在Framework中) 类的调用,并且实现Camera应用的业务逻辑和UI显示。一个Android应用中若要使用这个android.hardware.Camera类,需要在Manifest文件声明Camera的权限,另外还 需要添加一些<uses-feature>元素来声明应用中的Camera特性,如自动对焦等。具体做法可如下:

<uses-permissionandroid:name="android.permission.CAMERA"/>

<uses-featureandroid:name="android.hardware.camera"/>

<uses-featureandroid:name="android.hardware.camera.autofocus"/>

二.Framework层

1.android.hardware.Camera:代码位置/android/frameworks/base/core/java/android/hardware/Camera.java

这部分目标是framework.jar。这是是Android提供给app层调用的java接口。这个类用来连接或断开一个Camera服务,设置拍摄参数,开始、停止预览,拍照等。

2.android.hardware.Camera这个类是和JNI中定义的类是一个,有些方法通过JNI的方式调用本地代码得到,有些方法自己实现。
Camera的JAVA native调用部分(JNI):/android/frameworks/base/core/jni/android_hardware_Camera.cpp。Camera.java 承接JAVA代码到C++代码的桥梁。编译生成libandroid_runtime.so。libandroid_runtime.so库是公用的,其中除了Camera还有其他方面的功能。

3.Camera框架的client部分:

代码位置:/android/frameworks/base/libs/camera/下5个文件。

Camera.cpp

CameraParameters.cpp

ICamera.cpp

ICameraClient.cpp

ICameraService.cpp

它们的头文件在/android/frameworks/base/include/camera目录下。

这部分的内容编译生成libcamera_client.so。在Camera模块的各个库中,libcamera_client.so 位于核心的位置,作为Camera框架的 Client客户端部分,与另外一部分内容服务端libcameraservice.so通过进程间通讯(即Binder机制)的方式进行通讯。

4.Camera框架的service部分:

代码位置:/android/frameworks/base/services/camera/libcameraservice。

这部分内容被编译成库libcameraservice.so。CameraService是Camera服务,Camera框架的中间层,用于链接CameraHardwareInterface和Client部分 ,它通过调用实际的Camera硬件接口来实现功能,即下层HAL层。



三.硬件抽象层HAL Hardware Abstraction Layer

这个层次其实就是用户空间的驱动代码。前面有介绍过框架层对下在CameraHardwareInterface.h(/android/frameworks/base/include/camera/CameraHardwareInterface.h)。 头文件中定义了 Camera硬件抽象层的接口,它是包含纯虚函数的类,必须被实现类继承才能使用。HAL层正好继承 CameraHardwareInterface接口,依据V4l2规范实例化底层硬件驱动,使用ioctl方式调用驱动,最终生成 libcamera.so供框架的libcameraservice.so调用。

这层的代码在/android/hardware/XXX/libcamera目录下(也有可能在vendor目录中对应的 libcamera下)。注意这里的XXX是不同厂商为不同产品(板子)而建的目录,以高通msm平台为例,这里XXX用msm7k表示,这样 高通msm平台下这个HAL的目录即为/android/hardware/msm7k/libcamera。不难看出,如果要在某硬件平台上运行 Android,也就主要在这一层进行修改,因为它是直接和底层硬件驱动相关的。上面也讲过,应用框架层对上对下都定义的标准接口,这样做的目的也就是 使上层的代码独立,在porting中不受影响。所以我们现在可以基本确定,如果要改Camera的硬件,框架层以上的部分都可以不动,要改就改 HAL到内核层的部分,这也是Android底层开发的主要工作。

四.Driver层

这一层主要是基于Linux的设备驱动。对Camera来说,一般是按V4l2规范将Camera原子功能以ioctl的形式暴露出来供 HAL层调用的实现。

主要功能的实现代码在/android/kernel/drivers/media/video/XXX下。跟HAL层目录一 样,XXX是不同厂商不同平台的目录,以高通msm平台为例,这个目录就是/android/kernel/drivers/media/video /msm。所以要在Android平台上添加硬件功能,首先考虑将它的驱动加到Android的Linux内核中。




更多相关文章

  1. 关于Android使用proguard进行代码混淆
  2. Android实现动态改变app图标的示例代码
  3. 性能优化之Java(Android)代码优化
  4. 性能优化之Java(Android)代码优化
  5. Android调用平台功能具体技巧分享
  6. Android开发指南1-框架主题-基础知识
  7. Android应用程序核心-应用程序的基本组件
  8. Android之BitTube
  9. 【Android】MapView和其它控件一起显示

随机推荐

  1. 自定义控件--虚线
  2. Android环境配置----在Ubuntu上安装JDK
  3. Android在WebView上构建Web应用程序
  4. RecyclerView初级使用
  5. Android中的AnimationDrawable的使用
  6. Android(安卓)Multiple dex files define
  7. android shareperfence的存储更改与读取
  8. android出现段错误时的查找定位的方法
  9. 如何把你的安卓手机变成Linux?
  10. SoLoader,android动态加载so库