Android系统启动过程
Android系统启动包括两大步骤:1、Linux内核启动,2、Android架构启动。
- Linux内核启动:主要是bootLoader的启动和初始化驱动,安装文件系统等,与我们的CameraService启动关系不大,不做深入探讨,唯一需要注意的是,在Linux内核启动的最后,会启动第一个用户进程init进程,他是所有的用户进程的父进程,由此进入了Android架构的启动阶段
- Android架构启动:init进程启动后会自动加载
init.rc
(/system/core/rootdir/init.rc)脚本,当他执行mount_all指令挂载分区时,会加载包括system、vendor、odm等目录下的xxx/etc/init目录下的所有rc脚本。
CameraService的启动
通过看Framework层Camera的代码,我们发现在framework/av/camera/目录下有一个cameraserver文件夹,里边有一个cameraserver.rc
文件。
// cameraserver.rc
//通过init进程启动cameraserver进程,启动路径为/system/bin/cameraserver
service cameraserver /system/bin/cameraserver
class main
user cameraserver
group audio camera input drmrpc
ioprio rt 4
writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
通过Android系统启动过程一节我们了解到init进程会启动后会自动执行*xxx/etc/init目录下的所有rc脚本,源码中我们又看到了一个cameraserver.rc
的文件,那么init.rc
又是如何调用到cameraserver.rc
的呢?
继续来看Android.mk
打包文件
// Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
//源文件,具体执行命令的文件
LOCAL_SRC_FILES:= \
main_cameraserver.cpp
LOCAL_SHARED_LIBRARIES := \
libcameraservice \
libcutils \
libutils \
libbinder \
libcamera_client
//模块名称 cameraserver
LOCAL_MODULE:= cameraserver
LOCAL_32_BIT_ONLY := true
LOCAL_CFLAGS += -Wall -Wextra -Werror -Wno-unused-parameter
LOCAL_INIT_RC := cameraserver.rc
include $(BUILD_EXECUTABLE)
其中的LOCAL_INIT_RC := cameraserver.rc
将cameraserver.rc
挂载到system/etc/init目录中,这样init.rc
就可以调用cameraserver.rc
。
Android.mk
中还指明了具体执行的源文件为main_cameraserver.cpp
。该文件在源代码中位于framework/av/camera/cameraserver目录中,和cameraserver.rc
位于同一目录。
我们来看一下main_cameraserver.cpp
的main
方法,其中的CameraServe::instantiaicte()
即为cameraservice的初始化。至此,cameraserver进程启动完毕。
// main_cameraserver.cpp
int main(int argc __unused, char** argv __unused)
{
signal(SIGPIPE, SIG_IGN);
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
//初始化CameraService服务
CameraServe::instantiaicte();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
总结一下
- Andorid.mk将
cameraserver.rc
打包到system/etc/init目录下,并指定源代码为main_cameraserver.cpp
; - Android架构启动时启动
init.rc
进程,启动了位于system/etc/init目录下的cameraserver.rc
。值得一提的是,同时也会启动zygote进程(第一个Java层进程,也是Java层所有进程的父进程)、ServiceManager、mediaserver(多媒体服务进程,Android7.0之前cameraserver属于mediaserver,和mediaserver位于同一进程)、surfaceflinger(屏幕渲染相关的进程)等。之后zygote会孵化出启动system_server进程,Android framework里面的所有service(ActivityManagerService、WindowManagerService等)都是由system_server启动。 - 启动
cameraserver.rc
时,执行main_cameraserver.cpp
中的main
方法,通过CameraServe::instantiaicte()
初始化CameraService。