2.1 Android启动与CameraService进程加载

从这一章节开始,笔者将对Camera的Framework框架进行分析。

对于Camera Framework框架而言,其核心就是CameraService,所以本节将首先探究Camera service是什么,Camera Service是怎么来的。

Android框架启动过程

Android在开机时,首先装载BootLoader引导程序,进行硬件上电,从初始代码处开始执行初始化,再进行第二阶段的代码加载和初始化。然后就进入到Kernel加载和初始化阶段,进行初始化驱动、安装根文件系统等操作,之后会启动第一个用户进程init进程。

Init进程是所有用户进程的父进程,会进行守护进程的创建,同时会创建关键进程。init进程启动后会加载init.rc脚本,CameraServer进程就是在这时启动的。

于此同时启动的进程还包括MediaServer、ServiceManager、mediaserver(多媒体服务进程)、surfaceflinger(屏幕渲染相关的进程)等。

其中ServiceManager是一个守护进程,在应用层通过context.getSystemService()方法获取的各种服务Manager都是在这里进行管理。它维护着系统服务和客户端的binder通信。

CameraService进程

我们已经知道init进程在加载init.rc之后会去加载其他rc文件从而启动其他进程,CameraServer进程的rc文件在/frameworks/av/camera/cameraserver/cameraserver.rc路径下,由同级目录的Android.mk文件打包到/system/etc/init/目录下,这个目录就是被init进程启动脚本的目录之一。

CameraServer进程启动之后,就会进行CameraService的初始化。在文件/frameworks/av/camera/cameraserver/main_cameraserver.cpp中,执行了CameraService::instantiate();方法。这个方法不在CameraService中,而是它的父类BinderService的方法。

在这个方法中,调用了addServerice()方法,传入的参数是service name也就是”media.camera”,以及通过new创建的一个CameraService对象。这个方法定义在/frameworks/native/libs/binder/IServiceManager.cpp中,功能就是创建一个Service。

该方法传入的第二个参数是一个sp类型的变量,sp是Android定义的一种指针格式,会调用包装对象的onFirstRef()方法。这里就是CameraService。

在onFirstRef方法中,直观地进行了四步操作,创建CameraModule、获取Camera的一些信息、设置callback、链接CameraServiceProxy服务。如果继续追踪到HAL层,会看到CameraModule进行了动态链接库的加载等操作,这部分内容不在此展开。

通过addService()方法中的transact()就可以进行service的注册,同时生成一个句柄,这个句柄就是“camera”,也就是应用层获取Manager时的Context.CAMERA_SERVICE

至此,CameraService的整个启动流程就已经走完了,我们也已经回答了CameraService是怎么来的这个问题。

下一章节开始,我们将对camera流程中的各个环节进行梳理,从而探究CameraService是什么的问题。

 

附一

https://img-blog.csdn.net/20171116134654167?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTMzMjMyNDk1Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

1  Android启动过程框架

原文:https://blog.csdn.net/a332324956/article/details/77456632

附二

2 Binder示意图

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章