打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
android6.0源码分析之Camera API2.0简介

前面几篇主要分析的是android Camera API1.0的架构以及初始化流程,而google在android5.0(Lollipop)开始对Camera的架构进行了调整,为了适应HAL3,新添加实现了CameraDeviceClient,而Camera API1.0已经被deprecated(即可能在更新的版本里会不支持此API).


接下来,我将会分如下几篇文章来分析Camera2
android6.0源码分析之Camera API2.0简介
android6.0源码分析之Camera2 HAL分析
android6.0源码分析之Camera API2.0下的初始化流程分析
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析
android6.0源码分析之Camera API2.0下的Capture流程分析
android6.0源码分析之Camera API2.0下的video流程分析
Camera API2.0的应用


1、Camera API2.0的架构图

Camera API2.0下的Camera架构与API1.0有所区别,下面将给出Camera API2.0以及Camera HAL3.2+下的Camera的总体架构图:


由图可知,Java层要想与C++层的CameraService层进行通信,都是通过Java层的IPC Binder进制进行的,主要包括ICameraService.aidl以及ICameraDeviceUser.aidl两个接口来实现,其会在Java层维护一个CameraDeviceImpl即Camera设备的代理,而CameraService以及CameraDeviceImpl的初始化会在此文的第二,第三节进行分析。而Java层对Camera的具体操作的操作流程大致为,Java层通过Device代理发送一个CaptureRequest,而C++层进行相应的处理,再调用相应的回调来通知Java相应的处理结果,并将相应的Capture数据保存在Surface Buffer里,这样Java层在回调函数中可以对数据进行相应的处理。而对于具体操作流程的分析,请参考文章开始时的Camera2相关文章的连接。


2、Java层的CameraService的实现和应用

从Camera API2开始,Camera的实现方式有所不同,最主要的区别是不再使用JNI来调用本地代码,从而获得本地CameraService,并实现其C/S模式的通信,而是直接在Java层通过Java层的IPC Binder机制来获取Java层的CameraService的代理对象,从而直接在Java层获取本地的CameraService与Camera Device进行相应的通信。
相应的代码及目录:
ICameraService.aidl:frameworks/base/core/java/android/hardware
CameraService.cpp:frameworks/av/services/camera/libcameraservice
CameraManager.java:frameworks/base/core/java/android/hardware/camera2

获取CameraService的核心代码如下:

//CameraManager.javaprvate void connectCameraServiceLocked(){ if(mCameraService != null)return; //获取Binder IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME); if(cameraServiceBinder == null){ return; } try{ cameraServiceBinder.linkToDeath(this,/*flags*/ 0); }catch(RemoteException e){ return; } ICameraService cameraServiceRaw = ICameraService.Stub.asInterface(cameraServiceBinder); //根据cameraServiceRaw 创建CameraService实例 ICameraService cameraService = CameraServiceDecorator.newInstance(cameraServiceRaw); ... try{ //添加监听 cameraService.addListener(this); //赋值给mCameraService的全局变量 mCameraService = cameraService; }catch(CameraRuntimeException e){ ... }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

由代码可知,通过Java层的Binder从ServiceManager里获取了一个Java层的CameraService实例,在打开Camera的流程中,会通过此CameraService(Native的CameraService)与Camera通信,而其中的通信通过ICameraDeviceUser来实现,接下来分析ICameraDeviceUser的实现。

3、ICameraDeviceUser.aidl的通信实现

Java层与C++ CameraService层之间的通信,通过封装了一个CameraDeviceUser来实现,它只是在Java层使用了AIDL技术来实现Client,即在Java层维护了一个CameraDevice,这样的好处是响应速度更快,因为这样不需要通过每次进入Native层来完成通信,而可以通过Java层的IPC Binder机制即可完成。即API2.0通过AIDL实现一个接口ICameraDeviceUser,从而在Java层维护一个Camera proxy,之后的通信都是通过此代理CameraDeviceImpl来实现。

相关代码及目录:
ICameraDeviceUser.aidl:frameworks/base/core/java/android/hardware/camera2
ICameraDeviceUser.cpp:frameworks/av/camera/camera2
CameraDeviceImpl.java:frameworks/base/core/java/android/hardware/camera2/impl

获取Camera Device的Java层代理的核心代码如下:

//CameraManager.javaprivate CameraDevice openCameraDeviceUserAsync(...){ //初始化Camera Java层代理对象 CameraDevice device = null; try{ synchronized(mLock){ //初始化ICameraDeviceUser ICameraDeviceUser cameraUser = null; //初始化具体的CameraDevice代理 android.hardware.camera2.impl.CameraDeviceImpl deviceImpl = new android.hardware. camera2.impl.CameraDeviceImpl(cameraId,callback,handler,characteristics); BinderHolder holder = new BinderHolder(); ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks(); ... try{ //如果支持HAL3.2+的devices if(supportsCamera2ApiLocked(cameraId)){ //获取CameraService ICameraService cameraService = CameraManagerGlobal.get().getCameraService(); ... //连接设备 cameraService.connectDevice(callbacks,id,mContextgetOpPackageName() ,USE_CALLING_UID,holder); //通过Binder获得打开的Camera设备返回的Camera代理 cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); }else{//否则用遗产API cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks,id); } }catch(...){ ... } //包装代理对象 deviceImpl.setRemoteDevice(cameraUser); device = deviceImpl; } }catch(...){ ... } 返回Camera代理 return device;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

由代码可知,首先获取CameraService,然后通过它来开启Camera,而开启成功后,C++层会返回一个Camera device代理对象,此处即为ICameraDeviceUser,所以在Java层对其进行相应的封装,变成一个CameraDeviceImpl对象,此后,只要需要对Camera进行操作,都会调用CameraDeviceImpl对象的相关方法,并通过ICameraDeviceUser以及Java IPC Binder来与本地的Camera device进行通信,至此,Camera API2.0的框架就分析结束了,具体的操作,如Camera的初始化,preview,capture等流程的分析,请看文章开始时,所列出的分析链接。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android Camera API2.0下全新的Camera FW/HAL架构简述
camera api2封装层
Android的Camera架构介绍
Android 5
Camera显示之Framework层设置显示窗口
android Camera模块分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服