IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Camera之CameraServer的启动过程 -> 正文阅读

[移动开发]Android Camera之CameraServer的启动过程

目录

前言? ? ? ?

CameraServer启动过程概览

总结


前言? ? ? ?

? ? ? ?在系统启动过程中,init进程会启动起来,当init进程启动后,会去解析位于system/core/rootdir目录下的init.rc文件,最终会解析到到/frameworks/av/camera/cameraserver/cameraserver.rc?

 service cameraserver /system/bin/cameraserver
     class main
     user cameraserver
     group audio camera input drmrpc
     ioprio rt 4
     task_profiles CameraServiceCapacity MaxPerformance
     rlimit rtprio 10 10

? ? ? ? 这个服务的名字叫cameraserver,其对应的可执行文件的位置在/system/bin/cameraserver。关于.rc文件的讲解,请参考一下网上其他博客,本文就直接略过了.......

? ? ?最终会进入到?/frameworks/av/camera/cameraserver/main_cameraserver.cpp的main函数中,CameraService::instantiate()就是开始唤起cameraserver了。

int main(int argc __unused, char** argv __unused)
26  {
27      signal(SIGPIPE, SIG_IGN);
28  
29      // Set 5 threads for HIDL calls. Now cameraserver will serve HIDL calls in
30      // addition to consuming them from the Camera HAL as well.
31      hardware::configureRpcThreadpool(5, /*willjoin*/ false);
32  
33      sp<ProcessState> proc(ProcessState::self());
34      sp<IServiceManager> sm = defaultServiceManager();
35      ALOGI("ServiceManager: %p", sm.get());
36      CameraService::instantiate();
37      ALOGI("ServiceManager: %p done instantiate", sm.get());
38      ProcessState::self()->startThreadPool();
39      IPCThreadState::self()->joinThreadPool();
40  }
41  

下面来看一看CameraService类的构成,如下?

class CameraService :
 ?    public BinderService<CameraService>,
 ?    public virtual ::android::hardware::BnCameraService,
 ?    public virtual IBinder::DeathRecipient,
 ?    public virtual CameraProviderManager::StatusListener
 ?{
 ?    friend class BinderService<CameraService>;
 ?    friend class CameraOfflineSessionClient;
        ..........................
? }

? ? ? ? 这里采用了奇异递归模板模式,即把派生类作为基类的模板参数,这里BinderService是CameraService的基类,是一个模板类,CameraService是BinderService的子类,同时也是BinderService的模板参数。

CameraServer启动过程概览

? ? 下图是CameraService的大致启动过程

  1. ?调用CameraService::instantiate()时,会call到其父类BinderService::instantiate(),这里面做的事情主要是向ServiceManager注册服务,即把CameraServer注册到ServiceManager中。如下这段代码所示,因为这里的SERVICE就是CameraService,在addService()函数中,getServiceName()会返回---->"media.camera",new SERVICE()即是构造CameraService
template<typename SERVICE>
class BinderService
{
  public:
      static status_t publish(bool allowIsolated = false,
                              int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) 
      {
          sp<IServiceManager> sm(defaultServiceManager());
          return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated,
                                dumpFlags);
      }
  
  
      static void instantiate() { publish(); }
...............
}

? ?2. 在addService()中,这里new了一个CameraService对象,CameraService被强指针引用,因此会进入到CameraService::onFirstRef()中。这里面做的事情主要是enumProviders(),里面会进一步调用addProviderLocked(),即枚举provider。
? ? ? 但是这一步有可能不会成功,因为这时候时候cameraProvider可能还没有完全起来,可以看有没有打印这条log(以‘internal/0’为例):
Camera provider HAL 'internal/0' is not actually available

? 3.如果在onFirstRef()中addProvider没有成功,那么后面会在CameraProviderManager::onRegistration()中再次调用addProviderLocked()去枚举Provider,流程如下图所示

hardware::Return<void> CameraProviderManager::onRegistration(
          const hardware::hidl_string& /*fqName*/,
          const hardware::hidl_string& name,
          bool preexisting) {
      std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
      {
         std::lock_guard<std::mutex> lock(mInterfaceMutex);
  
          addProviderLocked(name, preexisting);
      }
..............
}

? ? ? ? 可见在添加Provider的过程中会去构造ProviderInfo,在ProviderInfo初始化的过程中会先获取CameraProvider,通过Provider去获取?camera device相关的信息(如上图红色部分,ie.name、resourceCost、CameraId和版本等等),并将ProviderInfo和DeviceInfo存储在本地。CameraService、CameraProviderManager、ProviderInfo和DeviceInfo之前的关系如下图所示。

总结

所以cameraserver在启动过程中主要做两件事情:

1.向serviceManager注册服务

2.获取CameraProvider、CameraDevice的信息,并存储到本地。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:37:31  更:2021-08-01 14:37:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 18:44:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码