Camera应用是android多媒体系统中典型的采用C/S架构设计的应用,Client和Server在两个独立的线程间通过Binder机制通信。下面是Camera的总体构架图。
从应用层的Camera.java(packages\app\Camera),到framework java部分的Camera.java(framework\base\core\java\android\hardware),再到JNI层的android_hardware_camera(framework\base\core),接着转到framework C++部分的Camera.cpp和CameraService.cpp,Camera2Client.cpp。其中Framework C++部分的Binder数据通信结构如下:
下面大致分两个部分来介绍Camera:Camera的初始化以及Camera Preview流程。
Camera的初始化
由于Camera是通过Binder通信的,所以必然会在ServiceManager注册它的service。对应的路径是frameworks\av\media\mediaserver\Main_MediaServer.cpp下有个main函数, 其中CameraService::instantiate()就是注册CameraService服务的。接下来,我们回过头来,从CameraApp的初始化来看这个流程。
点开Camera应用图标后,Camera应用会在Activity的onCreate()方法中启动一个线程叫CameraStartUpThread。在该线程中,按照从启动到预览,分为几个步骤:
1、Open Camera
2、applyXXXCallbacks
3、applyParameters
4、startPreview
注册回调函数主要和Camera预览窗口的图标的点击有关,applyParameter主要和Camera的参数设置相关(如是否开启flash,picture size是多少等等)。这两个后面有机会再展开,这里主要分析openCamera和startPreview。
Util.openCamera(cameraId)
-->CameraHolder.instance().open(cameraId)
-->CameraManager.instance().cameraOpen(cameraId)
-->FrameworksClassFactory.openCamera(cameraId)
-->Camera.open(cameraId)
这里的Camera就是framework java部分的camera了,即framework\base\core\java\android\hardware下的Camera.java。这里的open动作会创建一个Camera实例,实例初始化调用native_setup(newWeakReference<Camera>(this), cameraId, packageName)。从函数名可以看出,调用转到JNI层了,通过JNI的命名规则,我们在android_hardware_Camera.cpp中找到android_hardware_Camera_native_setup()。调用关系:
Camera.open(cameraId)
-->new Camera(cameraId)</