基于Android6.0原生代码的Camera应用进行深入分析,对常用流程进行总结包括从上层app、framework到底层jni、native、hal,并且介绍Camera的疑难问题的解决思路。
1. Camera相关介绍
1.1 主要界面和主要类
1.2 Camera主要结构
1.2.1 Application framework
在此层,利用了android.hardware.Camera的API去调用camera的硬件。在内部,是通过JNI来与native的代码进行交互。
代码路径:frameworks/base/core/java/android/hardware/Camera.java
1.2.2 JNI
JNI的代码是与android.hardware.Camera进行联系的,此代码是调用更底层的native代码去获得物理camera设备的入口,并且给framework返回数据。
代码路径:frameworks/base/core/jni/android_hardware_Camera.cpp.
1.2.3 Native framework
native framework提供了android.hardware.Camera在native层的等价类。作用是调用IPCbinder去获得camera service的入口。
代码路径:frameworks/av/camera/Camera.cpp
1.2.4 Binder IPC proxies
IPC binder的代理方便地实现了跨进程的通信,其中有三个camera binder :ICameraService是cameraservice的接口;ICamera是特定的已打开的camera设备的接口;ICameraClient 是给framework层的回调接口。
代码路径:frameworks/av/camera
1.2.5 Camera service
是与HAL进行交互的具体实现
代码路径:frameworks/av/services/camera/libcameraservice/CameraService.cpp,
1.2.6 HAL
位于camera驱动和更高层次的android
framework之间,它定义了你必须实现的接口,该接口方便app能够正确地操作camera硬件。CameraHAL层的接口被定义在头文件:hardware/libhardware/include/hardware/camera.h:
包含的code基本上与android.hardware.Camera一致。这个头文件中声明了一个结构体camera_device,它包含了结构体camera_device_ops,该结构体中有指向实现camera HAL接口的函数的函数指针。关于开发者可以设置的camera参数的各中类型。
hardware/libhardware/include/hardware/camera_common.h:
定义了一个重要的结构体camera_module,这个结构体定义了一个标准结构,可以获取camera基本信息,比如ID和所有camera所共有的属性,比如是否是前置或者后置camera。
1.2.7 Kernel driver
与实际的camera硬件进行交互,并且通过HAL上实现。Camera硬件和驱动必须能够提供YV12和NV21格式的图像数据,以支持camera图像数据在显示屏上的预览和视频录制。