Android系统启动流程
- 按下电源开机,从ROM的特定位置加载
Bootloader 到RAM中 Bootloader 拉起OS执行linux 内核启动,设置缓存,加载驱动等。完成内核设置后,首先在系统文件中寻找init.rc 文件,启动init 进程。init的进程id为1,是在用户空间执行的第一个进程init 进程启动。对应的文件是init.cpp ,所在位置是system/core/init/init.cpp
init.cpp(init进程)中做的事情
- 创建和挂载启动所需的文件目录
- 初始化属性服务
- 设置子进程的信号处理函数
- 启动属性服务
- 解析
init.rc 文件
Zygote的启动
- 在
init.cpp 的循环中会启动服务,调用do_class_start 函数 - 在
do_class_start 函数中会循环寻找名称为main 的Zygote ,并调用StartIfNotDisabled 函数(位于service.cpp 中) - 在
StartIfNotDisabled 函数中,调用Start 函数 - 在
service.cpp 中的Start 函数中,进行必要的判断,是否服务已经启动/是否所需的文件已经存在,如果可以启动,则fork一个子进程.(写时复制,子进程会突然蒸发) - 在
fork 出来的子进程中,调用execve 函数,就会启动app_main.cpp 中的main 函数。文件路径为:framworks/base/cmds/app_processs/app_main.cpp - 在
app_main.cpp 的main 函数中,会解析参数。参数中有Zygote ,会调用runtime.start("com.android.internal.os.ZygoteInit") Runtime::start() 函数中,会startVm() 即创建虚拟机,会注册jni 方法。最终会通过jni 调用ZygoteInit 的main 方法ZygoteInit 的main 方法中主要做以下几件事:
- 调用
registerServerSocket 方法,创建一个服务端的Socket (此处具体的是一个LocalServerSocket),名称为zygote ,并转化了环境变量的值。 并启动这个服务端的Socket ,用于等待AMS 请求Zygote 进程来创建新的应用程序进程。 - 加载通用的资源,并进行一次
GC - 启动
SystemServer 进程。从zygote 进程中fork出一个子进程,名字为SystemServer - 在
SystemServer 的main 函数中会启动三类服务,引导服务,核心服务,其他服务
|