- Android系统启动流程
- init.cpp(init进程)中做的事情
- Zygote的启动
- `ZygoteInit`的`main`方法中做的事情:
- SystemServer中做的事情
- 按下电源开机,从ROM的特定位置加载Bootloader到RAM中
- Bootloader拉起OS执行
- linux内核启动,设置缓存,加载驱动等。完成内核设置后,首先在系统文件中寻找init.rc文件,启动init进程。init的进程id为1,是在用户空间执行的第一个进程
- init进程启动。对应的文件是init.cpp,所在位置是system/core/init/init.cpp
- 创建和挂载启动所需的文件目录
- 初始化属性服务
- 设置子进程的信号处理函数
- 启动属性服务 (属性服务中是用socket进行通信的)
- 解析init.rc文件
- 在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方法
- 调用registerServerSocket 方法,创建一个服务端的Socket(此处具体的是一个LocalServerSocket),名称为zygote,并转化了环境变量的值。 并启动这个服务端的Socket,用于等待AMS请求Zygote进程来创建新的应用程序进程。
- 加载通用的资源,并进行一次GC
- 启动SystemServer进程。
- 等待AMS的请求
- 创建SystemServiceManager管理各类服务
- 启动Binder线程池进行通信
- 启动三类服务,引导服务,核心服务与其他服务
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)