前面几篇主要分析的是android Camera API1.0的架构以及初始化流程,而google在android5.0(Lollipop)开始对Camera的架构进行了调整,为了适应HAL3,新添加实现了CameraDeviceClient,而Camera API1.0已经被deprecated(便可能在更新的版本里会不支持此API).java
接下来,我将会分以下几篇文章来分析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的应用android
一、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相关文章的链接。架构
二、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的核心代码以下:ide
//CameraManager.java
prvate 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){
...
}
}
由代码可知,经过Java层的Binder从ServiceManager里获取了一个Java层的CameraService实例,在打开Camera的流程中,会经过此CameraService(Native的CameraService)与Camera通讯,而其中的通讯经过ICameraDeviceUser来实现,接下来分析ICameraDeviceUser的实现。函数
三、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/implthis
获取Camera Device的Java层代理的核心代码以下:google
//CameraManager.java
private 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;
}
由代码可知,首先获取CameraService,而后经过它来开启Camera,而开启成功后,C++层会返回一个Camera device代理对象,此处即为ICameraDeviceUser,因此在Java层对其进行相应的封装,变成一个CameraDeviceImpl对象,此后,只要须要对Camera进行操做,都会调用CameraDeviceImpl对象的相关方法,并经过ICameraDeviceUser以及Java IPC Binder来与本地的Camera device进行通讯,至此,Camera API2.0的框架就分析结束了,具体的操做,如Camera的初始化,preview,capture等流程的分析,请看文章开始时,所列出的分析连接
---------------------
代理