文章目录
图片链接
Android系统启动流程
- 按下电源开机,从ROM的特定位置加载
Bootloader
到RAM中 Bootloader
拉起OS执行linux
内核启动,设置缓存,加载驱动等。完成内核设置后,首先在系统文件中寻找init.rc
文件,启动init
进程。init的进程id为1,是在用户空间执行的第一个进程init
进程启动。对应的文件是init.cpp
,所在位置是system/core/init/init.cpp
init.cpp(init进程)中做的事情
- 创建和挂载启动所需的文件目录
- 初始化属性服务
- 调用一个函数来初始化
- 设置子进程的信号处理函数
- 启动属性服务 (属性服务中是用socket进行通信的)
- 监听时设置了 最我可以同时为8个试图设置属性的用户提供服务
- 解析
init.rc
文件
解析init.rc
文件
init.rc
文件主要有Action,command,service,option,import
语句组成,action和command
配合使用,service和option
语句配合使用。并且使用import导入文件。
Android8.0对init.rc文件进行了拆分,每一个服务对应一个文件。
解析Action要用ActionParser,解析Service要用ServiceParser.。在ServiceParser中,解析时只要与两个函数有关,一个函数是ParserSection
,一个函数是EndSection
。解析过程总体来说是:根据参数创造出Service对象,然后将Service对象加入到一个Service链表中。
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
进程。 - 等待AMS的请求
SystemServer中做的事情
总体来说,是先启动binder线程池,然后再进入main()方法。
- 创建
SystemServiceManager
管理各类服务 - 启动Binder线程池进行通信
- 启动三类服务,引导服务,核心服务与其他服务