启动三段式:进程都是这样的
1.进程启动 2. 准备动作 3.loop循环
目标:
1.Zygote的作用是什么
启动systemserver 启动 进程
2.zygote进程怎么启动的
zygote的启动流程:
1.init进程fork出zygote 进程
2.启动虚拟机,注册jni函数
3.预计加载系统资源
4.启动systemServer
5.进入socket loop
init 进程是linux启动之后用户空间第一个进程,首先启动一个配置文件,init.rc,然后需要启动那些系统服务,zygote就是要启动的系统服务。
使用fork程序来启动进程,蓝色的部分是启动进程的地方,黄色的部分是其中的参数
启动的方式是使用fork启动。
启动进程的方式
fork+handle
fork会返回二次,子进程返回为0,父进程会返回子进程的pid
fork函数会让子进程继承父进程的资源,如果使用 execve的方式去加载进程,会让子进程从父进程继承的资源被清除掉。
pid_t pid =fork();
if(pid==0){
//child process
}else{
//parent process
}
fork+execve
pid_t pid = fork();
if(pid==0){
//child process
execve(path,argv,env);//可执行程序路径 带的参数 环境变量
}
else{
//parent process
}
信号处理
sigchld
父进程 ------fork ------子进程
如果子进程挂了,那么父进程就会收到这个信号。父进程就可以让子进程重启。
Zygote的Native世界
为了之后进入java世界作准备
启动Android虚拟机 。 注册Android的jni函数 。 jni调用进入Java世界
int main(int argc,char * atgv[])){
JavaVm *jvm;
JniEnv *env;
JNI_CreateJavaVm(&jvm,(void**)&env,&vm_args);//在zygote进程会创建java虚拟机,普通进程是zygote进程孵化出来的,会继承java虚拟机。
只需要重制状态就好。
jclass clazz = env->FindClass("ZygoteInit");
jmethodID method = env->GetStaticMethodID(clazz,"Main","([Ljava/lang/Sting;)V");
env->CallStaticVoidMethod(clazz,method,args);
jvm->DestoryJavaVm());
}
Zygote的java世界
preload Resources (预加载资源 ,比如主题相关的资源)---fork---systemServer
Zygote和System server 采用socket通信
Loop 中怎么处理socket请求,关键代码:
Loop socket循环,新请求过来的时候 执行 runOnce
boolean runOnce(){
String[] args = readArgumentList();//读取参数
int pid = Zygote.forkAndSpecialize();//创建子进程
if(pid==0){
//in child
handleChildProc(args,...);//ActivityThread.mian(); 这就是进程启动之后需要做的事情。
return true;
}
}
1.zygote 在fork要保持单线程
父进程里面在fork的时候有多少个线程,子进程在创建的时候只有一个线程,所以在fork之后子进程里面的线程不见了。但是子进程会复制父进程的资源,
如果父进程是多线程,会导致很多奇怪的问题。
所以在fork在创建子线程的时候,把主线程之外的停掉。
Zygote也是这么做的。
2.zygote的ipc没有采用binder
binder机制是应用程序创建之后自己启动的binder
zygote 采用的socket
问题:
孵化应用进程的事为什么不交给systemserver去做,而设置zygote:
我们知道,应用在启动的时候需要做很多准备工作,包括启动虚拟机,加载各类系统资源等等,这些都是非常耗时的,如果能在zygote里就给这些必要的初始化工作做好,子进程在fork的时候就能直接共享,那么这样的话效率就会非常高。这个就是zygote存在的价值,这一点SystemServer是替代不了的,主要是因为SystemServer里跑了一堆系统服务,这些是不能继承到应用进程的。所以给SystemServer和应用进程里都要用到的资源抽出来单独放在一个进程里,也就是这的zygote进程,然后zygote进程再分别孵化出SystemServer进程和应用进程。
zygote的ipc通信机制为什么不采用binder,采用binder会有什么问题。
3.进程启动之后做了什么
问题:
谈谈你对zygote的理解:
1.what ,干嘛的:zygote 的作用是什么?
2.how:怎么做的。 zygote的启动流程。
3.why:zygote工作原理。 怎么孵化进程,怎么通信。
zygote 采用fork的方式孵化子进程,子进程会复制父进程中的资源
这个是本人总结的,mkw的framework面试的资料,需要具体的视频和其他的资料,TB店铺 纳新工作室 中找framework 资料就好哈。