1. Zygote的两个作用:
- 启动SystemServer
- 孵化应用进程
2. Zygote的启动三步骤
(1)进程启动
(2)准备工作
(3)LOOP循环接收消息
不只是Zygote启动是这样的套路,SystemServer进程的启动同样如此,甚至包括app的应用进程也是的。
3. Zygote的启动具体过程
(1)启动配置:
init进程 <—(init.rc文件)
init.rc文件包含要启动Zygote进程的必要信息。
(2)启动进程:
pid_t pid = fork();
if(pid == 0)
//childProcess
else
//parentProcess
子进程返回的pid为0;父进程返回的pid是子进程的pid。因此可以通过判断当前pid的值,来判断当前是子进程还是父进程。
4. Zygote进程启动之后
(1)Native:
Zygote是C++实现的,该进程启动之后会做两件事情,第一是在Native世界完成执行Java世界的准备工作:
- 启动Java虚拟机
- 注册Android的JNI函数
- 进入Java世界
(2)Java
进入Java世界后,Zygote主要做三件事:
- 加载资源(比如主题)
- fork出SystemServer进程
- 进入LOOP循环(轮询socket,外界可以与之进行socket通信)
//LOOP循环的逻辑
LOOP{
if(isMsg){
runOnce();
}else
continue;
}
//
v runOnce(){
String[] args = readArgumengList();
int pid = Zygote.forkAndSpecialize();
if(pid == 0){
//in child子进程执行ActivityThread.main()应用进程
handleChildProc(args,……);
return true;
}
}
5. Zygote进程和应用进程的关系
app应用进程是从Zygote进程fork出来的,是父子的关系,有继承。但是注意,应用进程的Binder机制却不是从Zygote继承过来的,是进程创建成功后,自己去启动出来的。
网友评论