Android Camera框架

总体介绍
Android Camera 框架从整体上看是一个 client/service 的架构,
有两个进程:
client 进程,可以看成是 AP 端,主要包括 JAVA 代码与一些 native c/c++代码;
service 进 程,属于服务端,是 native c/c++代码,主要负责和 linux kernel 中的 camera driver 交互,搜集 linux kernel 中 camera driver 传上来的数据,并交给显示系统显示。
client 进程与 service 进程通过 Binder 机制通信, client 端通过调用 service 端的接口实现各个具体的功能。

1总体框图

Android Camera框架_第1张图片

2应用层

主要代码在packages/apps/Camera/

3Framework层

3.1 Framework.jar

这层的代码主要编译成framework.jar frameworks/base/core/java/android/hardware/Camera.java
这部分是提供给Android的应用接口

3.2 libandroid_runtime.so

这层是Camera的JAVA native调用部分:./frameworks/base/core/jni/android_hardware_Camera.cpp
libandroid_runtime.so除了给camera调用外,还有其他的功能

3.3Camera client

这里主要是编译生成libcamera_client.so client和libcameraservice.so进行通信(IPC binder通信)

weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ ls frameworks/av/camera/
Android.mk      Camera.cpp            ICameraClient.cpp          ICameraRecordingProxyListener.cpp  IProCameraCallbacks.cpp  NOTICE
camera2         CameraMetadata.cpp    ICamera.cpp                ICameraService.cpp                 IProCameraUser.cpp       ProCamera.cpp
CameraBase.cpp  CameraParameters.cpp  ICameraRecordingProxy.cpp  ICameraServiceListener.cpp         MODULE_LICENSE_APACHE2   tests
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ 

既然client和service用的是binder通信,那么就必须把service注册到servicemanager里面去,查看代码
./frameworks/av/media/mediaserver/main_mediaserver.cpp
里面有一句CameraService::instantiate();  这一句就是用来注册这个service的
这样,Camera就在ServiceManager完成服务注册,提供给client随时使用。

3.4Camera service

Camera service是实现client的接口,并且和HAL层进行通信的,是camera的服务层
代码位置:/frameworks/av/services/camera/libcameraservice

weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ ls ./frameworks/av/services/camera/libcameraservice
Android.mk  api2     CameraDeviceFactory.cpp  CameraService.cpp  common   device2  gui                     NOTICE
api1        api_pro  CameraDeviceFactory.h    CameraService.h    device1  device3  MODULE_LICENSE_APACHE2  utils
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ 

4Camera Hal

Camera Hal层是各个不同厂商的不通之处,上面的层次是Android系统特有的。
怎么确定我们使用这个系统的hal层呢?
首先用busybox在开发板上面确定一下我们so的名字
这里写图片描述
这样我们可以看出我们的so名字是camera.default.so
然后再通过命令在代码里面找到我们的代码位置

weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ find ./ -iname *.mk|xargs grep -wrn camera.default
./mediatek/hardware/mtkcam/module/Android.mk:67:LOCAL_MODULE := camera.default.module
./mediatek/hardware/mtkcam/devicemgr/Android.mk:72:LOCAL_MODULE := camera.default.devicemgrbase
./mediatek/platform/mt8127/hardware/mtkcam/devicemgr/Android.mk:73:LOCAL_WHOLE_STATIC_LIBRARIES += camera.default.module
./mediatek/platform/mt8127/hardware/mtkcam/devicemgr/Android.mk:74:LOCAL_WHOLE_STATIC_LIBRARIES += camera.default.devicemgrbase
./mediatek/platform/mt8127/hardware/mtkcam/devicemgr/Android.mk:96:LOCAL_MODULE := camera.default
./build/target/product/common.mk:302:    camera.default \
./hardware/libhardware/modules/camera/Android.mk:19:LOCAL_MODULE := camera.default
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ 

可以看出我们的代码位置应该在:./mediatek/platform/mt8127/hardware/mtkcam/

5driver

驱动层的话一定要遵循v4l2的框架,并且生成设备节点给hal层调用,我们驱动层的代码可以从添加一个摄像头那个文章里面看出来。
mediatek/custom/mid713l_lp_lvds/kernel/imgsensor/bf3703_yuv/

你可能感兴趣的:(android,Camera)