Camera作为一项近几年越来越火的领域,被广泛的应用到手机、车载、短视频、安防监控等领域,那本系列会对android camera作一个整体到细节的介绍。
Camera本身其实是一个硬件设备,下图是每个学习android嵌入式开发都很熟悉的,整个android的系统其实是分层的,Camera作为其中的一个模块也是如此。
1)可以从android 架构图,看到整个android的大体框架,大致分为了5层,最上面一层即app层,即我们日常用的手机、平板里使用的那些app。
Camera在这层对应的既是一些拍照软件,比如各种美颜相机之类的。
2)第二层是android framework层,这里的framework层是平台无关的,是用java语言来写的。可以看出一些做app开发的研发人员也会比较熟悉的一些模块,比如android的4大组件、activity、content provider,service,boardcast,还包含一些WMS、AMS等等。
3)我们知道android本身是基于linux的,而java本身是跑在虚拟机上的,所以这里会有一个android runtime这一层,也就是会有这样一层把app的行为通过IPC 调用到底层。
4)还有一些开发者是基于android开发一些基于不同平台的lib,就有了所谓的NDK开发,在这一层,开发者可以开发属于他们自己的lib,并且可以不用暴露自己的源代码,可谓是是一层安全性和隐私的保护。比如SQLite数据库,FreeType字库,还有OpenGl 3D这些lib。
5)再往下是HAL层,也就是硬件抽象层,这层是google为了保护一些驱动厂商的知识产权,我们知道linux是开源的,kernel的代码需要公开化,一些公司需要保护自己的原始代码,则把这部分从kernel剥离开来,单独放到HAL层,并且可以屏蔽一些硬件差异化的问题。
6)最底层也就是kernel层,也就是linux的内核层,另外还包含了一些phone里所有硬件的驱动。
所以从整张图来看,camera是一个涉及从android的最上层到最底层的模块,包含app、framework、jni、native framework、HAL、kernel以及驱动。
好了这下可以进入camera的整体部分,下面是整个camera的架构图。
1)最上面的是camera app层,开发者可以自行开发,手机厂本身都会有自家的app,当然还有市场上流行的美图秀秀当然也属于这一层。
2)这些app都是基于android的sdk开发的,而对于camera的使用也是要遵循android定义的规则来,这点是跟其他app模块开发一样的,而android开放的接口也就是framework这一层。可以从上图看到有api1和api2二套版本,现在api1已经不用了,用的都是api2的版本。
3)再往下是java虚拟机和jni这一层,可以看得到在使用最新的api2时,android这边的IPC机制(也就是aidi)已经封装了framework到native framework的通信过程。
4)native Camera FW则是基于C++的camera framework层,一些c++的lib或者native的应用可以直接通过这一层去访问camera。
5)HAL则是平台厂商基于硬件去自定义,不同平台的实现也不是相同,主流的也就是Qualcomm,MTK,海思,展讯和三星,实现也是不同的。
6)kernel则是包含具体的camera驱动,这部分使得camera可以正常工作。
这边就是整个camera的大概介绍,后面会从上到下逐步介绍整个camera的模块。