Android 5.0 Camera系统源码分析(1):CameraService启动流程

本文详细分析了Android 5.0 Camera系统从frameworks层到hal层的启动流程,主要聚焦于CameraService的启动,包括instantiate()和publish()函数,以及如何通过hw_get_module()加载HAL模块来获取相机数量。在hal层,着重介绍了MTK平台的相机模块接口和枚举设备的过程。
摘要由CSDN通过智能技术生成

1. 前言

本文将分析Android系统源码,从frameworks层到hal层,暂不涉及app层和kernel层。由于某些函数比较复杂,在贴出代码时会适当对其进行简化。本文属于自己对源码的总结,仅仅是贯穿代码流程,不会深入分析各个细节。


分析android系统源码,需要对android系统的某些知识点有所了解

涉及的知识点有:

(1)Android系统的智能指针 - 参考老罗的Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

(2)Android进程间通信Binder - 参考老罗的Android进程间通信(IPC)机制Binder简要介绍和学习计划

(3)Android硬件抽象层(HAL) - 参考老罗的Android硬件抽象层(HAL)概要介绍和学习计划

2. frameworks层

Android的各个子模块的启动都是从它们的Service的启动开始的,所以我们将从CameraService的启动开始分析。CameraService的启动就在MediaServer的main函数中,代码路径在:frameworks/av/media/mediaserver/main_mediaserver.cpp

[cpp]  view plain   copy
  1. int main(int argc __unused, char** argv)  
  2. {  
  3.     ......  
  4.     CameraService::instantiate();  
  5.     ......  
  6. }  

CameraService类定义如下:

[cpp]  view plain   copy
  1. class CameraService :  
  2.     public BinderService<CameraService>,  
  3.     public BnCameraService,  
  4.     public IBinder::DeathRecipient,  
  5.     public camera_module_callbacks_t  
  6. {  
  7.     static char const* getServiceName() { return "media.camera"; }  
  8.     ......  
  9. }  

mediaserver的main函数中调用了CameraService的instantiate函数来创建实例,该函数的实现在其父类BinderService中实现

[cpp]  view plain   copy
  1. template<typename SERVICE>  
  2. class BinderService  
  3. {  
  4.     static status_t publish(bool allowIsolated = false) {  
  5.         sp<IServiceManager> sm(defaultServiceManager());  
  6.         return sm->addService(  
  7.                 String16(SERVICE::getServiceName()),  
  8.                 new SERVICE(), allowIsolated);  
  9.     }     
  10.   
  11.     static void instantiate() { publish(); }  
  12.   
  13. }  

1. instantiate函数只是简单的调用了publish函数

2. publish函数先构造CameraService,再通过addService函数将它注册到ServiceManager当中,而getServiceName函数获取到的值为“media camera”。这一切都是为了binder通信做准备

3. 这里使用了c++模版,从上面的CameraService类定义中可以看出,这里的SERVICE等于CameraService,也就是说publish函数中的new SERVICE等于new CameraService

4. 同时还使用了智能指针,也就是说除了调用CameraService的构造函数外,还会调用onFirstRef函数

[cpp]  view plain   copy
  1. CameraService::CameraService()  
  2.     :mSoundRef(0), mModule(0)  
  3. {  
  4.     ALOGI("CameraService started (pid=%d)", getpid());  
  5.     gCameraService = this;  
  6.   
  7.     for (size_t i = 0; i < MAX_CAMERAS; ++i) {  
  8.         mStatusList[i] = ICameraServiceListener::STATUS_PRESENT;  
  9.     }  
  10.   
  11.     this->camera_device_status_change = android::camera_device_status_change;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值