android4.4 Camera 框架纵横方向分析

白昼怎懂夜的黑 提交于 2020-04-06 12:55:33

一、Android系统的一般性框架
一、android 系统的启动流程
一张自做草图先大概了解下:


            第一个android进程,或许说是第一个dalvik进程zygote进程,是在init.rc中用命令启动的,init.rc在device/方案商/产品型号 中,各个厂商可能会有不同的命名,比如rk  init.rk30board.rc。里面会有启动zygote进程和传参的具体细节,如果想深入了解可参考老罗的系列文章:Dalvik虚拟机的启动过程分析。
          我这里引入一个形象的比喻,也是出自一位网友的博客。如果android是一个世界,我们把init.rc比喻成造物者,它创造的第一个人就是亚当(zygote),亚当(zygote)一个人太寂寞,用自己的肋骨(fork 子进程)创造了夏娃(SystemServer),夏娃(SystemServer)负责创建更多的人(package service,power service。。。。。),当创造的东西太多了,就需要一个管家(activity manage service)来管理,就这样人数(service)越来越多,但是仍然井然有序,每一个人的祖先都是zygote,他们的基因(各自所对应的dalvik虚拟机实例,或者后面版本的ART虚拟机实例)都是从祖先(zygote)遗传下来(zygote fork子进程之前就已经初始化了dalvik/art 虚拟机,所以都会复制一份给到子孙进程)。如果这个世界想诞生新的人(service),必须向AMS提出需求,然后转告给zygote,由zygote来进行fork子进程,其实有一点是不一样的,夏娃并不会自己创造人类,最终都是亚当来完成实质的创造过程。以上只是一个浅显的比喻,便于大家理解android中的service 各个级别。

二、Android的CS架构
一张草图说明一下:

流程看似简单,CS架构,这是android整体的基本框架,几乎所有的流程都是按照这么个章法来走的。了解android的基本框架,对android的各个模块的学习有很大的帮助,这个框架的核心就是基于IPC Binder的通信过程,涉及了C++中多种设计模式,比如代理模式,出现太多Bp,Bn开头的类名,比如builder模式(camera中会应用)等,还有当中引入的weak stronger pointer来对指针进行管理,大大减小了指针引起的各种内存问题。

三、Android 一般性Hardware AL框架
我觉得网上已经有相当不错的介绍,就拿老罗的文章,深入分析了hello module的例子,我就不赘述了:在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序。

二、Android camera的框架
一、Android camera framework层框架分析
抛出一张图压压惊:


           上面一个类+流程图的关系描述了camear中比较重要的接口startPreview的整体调用流程,这里数据流向和callback相关的类没有深入分析,后面博客会详细说明。图中已经说明了一切,我这边简单说下代码的位置:

camera java:
 frameworks\base\core\java\android\hardware
JNI interface :
 frameworks\base\core\jni
camera client:
 frameworks\av\camera
camera service:
 frameworks\av\services\camera

大家看C++代码的时候注意留意文件夹中的Android.mk文件,当中会描述该方案商会选择什么version的camera,即会参加编译成库的文件。

二、Android Hardware AL camera框架分析
序言:我手上的代码是RK3288的代码,所以这里仅介绍RK camera的框架,当然这里只是从框架上进行分析,具体细节后面系列文章会继续分析。
    
     下面先贴出service调用到hal层的接口


仔细跟踪代码会发现CameraSevice类中的方法onFirstRef()会去调用hw_get_module加载这个操作:


void CameraService::onFirstRef()
{
    LOG1("CameraService::onFirstRef");
 
    BnCameraService::onFirstRef();
 
    if (hw_get_module(CAMERA_HARDWARE_MODULE_ID,
                (const hw_module_t **)&mModule) < 0) {
        ALOGE("Could not load camera HAL module");
        mNumberOfCameras = 0;
    }
    else {
        ALOGI("Loaded \"%s\" camera module", mModule->common.name);
        mNumberOfCameras = mModule->get_number_of_cameras();
        if (mNumberOfCameras > MAX_CAMERAS) {
            ALOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",
                    mNumberOfCameras, MAX_CAMERAS);
            mNumberOfCameras = MAX_CAMERAS;
        }
        for (int i = 0; i < mNumberOfCameras; i++) {
            setCameraFree(i);
        }
 
        if (mModule->common.module_api_version >=
                CAMERA_MODULE_API_VERSION_2_1) {
            mModule->set_callbacks(this);
        }
 
        CameraDeviceFactory::registerService(this);
    }
}

具体细节可自己跟踪代码看看。

这个接口的定义在camerahal_module.cpp文件中,为的就是标准化camera的接口。每个接口的具体实现都在camera_hal.cpp中,不过当中还只是一个简单的抛出cmd的操作,这就涉及到了camera hardware 的架构设计了,下面抛出一张草图:


RK 的camera hal看起结构比较简单两个主要的线程一个负责处理上层的接口要求,一个负责处理数据流相关基本也是cs模式。


综上camera的架构大致梳理完毕,草图纯手工制作用的软件是亿图,下一阶段会具体到各个细节的实现。
 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!