Android系统底层基于Linux Kernel, 当Kernel启动过程会创建init进程, 该进程是所有用户空间的鼻祖, init进程会启动servicemanager(binder服务管家), Zygote进程(Java进程的鼻祖). Zygote进程会创建 system_server进程以及各种app进程,下图是这几个系统重量级进程之间的层级关系。
各大核心进程启动后,都会进入各种对象所相应的main()方法,如下
进程main方法
进程 | 主方法 |
---|---|
init进程 | Init.main() |
zygote进程 | ZygoteInit.main() |
app_process进程 | RuntimeInit.main() |
system_server进程 | SystemServer.main() |
app进程 | ActivityThread.main() |
主方法介绍
Init.main()
init进程(pid=1)是Linux系统中用户空间的第一个进程,主要工作如下:
创建一块共享内存空间,用于属性服务器
解析各个rc文件,并启动对应的属性服务进程
初始化epoll,一次设置signal、property,keychord 这三个fd对应的回调函数
进入无线循环,执行流程如下
检查action_quene列表是够为空,若不为空择启动相应的action
检查是否需要重启进程,若有择将其重新启动
进入epoll_wait状态 直到新系统属性变化事件(property_set属性值变化),或者收到紫禁城的信号,或者收到键盘输入时间,则会退出等待状态,执行相应的回调函数
init启动流程
zygote进程
Zygote是由init进程通过解析init.zygote.rc文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。
Zygote启动流程
解析init.zygote.rc中的参数,创建appRuntime并调用AppRunTime.start方法;
调用AddroidRuntime的startVm()方法并创建虚拟机,在调用startReg()注册JNI函数;
通过JNI的方式调用ZygiteInit.mian进入java区域
通过 registerZygoteSocket()建立Socket通道,zygote作为通信的服务气短,相应客户端的请求;
preload 预加载通用类,加载color,drawable资源 openGL,共享库、和webView 用于提高app的启动效率
zygote完成了大部分工作 ,接下来通过startSystemServer()来fork system_server
进程,也是framework的载体
zygote 完成所有工作 调用runSelectLoop 进入挂起状态;
Activity的启动过程
- 首先桌面点击图标 lancher才会用binder IPC 想system_server 发送startActivity请求
- system_server收到请求后,想Zygote发送创建进程请求
- zygote通过socket fork一个子进程 就是我们需要的App进程
- app进程通过BinderIPC 想system_server发送attchApplication请求
- system_server收到请求后进行一系类准备,然后发送scheduleLaunchActivity通知app进程
- app进程的binder线程(ApplicationThread)收到消息后通过Handler向主线程发送lancherActivity消息
- 主线程收到消息 通过反射创建 activity
- 调用activity的OnCreate方法