Zygote进程是安卓系统的一个重要进程,由init进程创建而来;另外系统里的重要进程(system_server等)都是由zygote进程fork的,所有的app进程也是由zygote进程fork的。
一、C 里的fork函数
fork是Linux里面创建子进程的函数,fork 执行后原来的进程资源会复制一份,如下图主进程号是29709,调用fork之后返回的pid是子进程的进程号29714,此时子进程也在运行了,pid是0。所以看到很多源码里面都是判断这里的pid,pid > 0 就是在主进程,pid == 0 就是子进程, pid < 0代表进程创建失败
二、ZygoteInit Zygote ZygoteServer等java类
该部分主要介绍一下system_server进程和app进程怎么由zygote进程fork的,至于zygote进程怎么起来的以后有机会再讨论。
zygote进程的入口肯定是main函数了,就是ZygoteInit.java的main方法
非关键流程都删除了,主要就是这段里面的两个方法
forkSystemServer:启动system_server进程
runSelectLoop:开启轮询,等待app进程的创建请求。
2.1 system_server进程启动
我就是将主要流程截图出来了,不想写过多文字 *_*
forkSystemServer 一直到JNI最终就是调用C语言里面的fork函数,pid == 0, 代表新创建的子进程(即system_server进程),否则返回null 继续走zygote主进程
下面到了RuntimeInit.java
这部分就是通过反射找到system_server的main函数,通过Runnable对象返回。接着就是调用第二节一开始的r.run方法,实际就是直接调用SystemServer.java 的 main函数了。
2.2 app进程启动
app的启动一般是由Launcher首先发起动作到AMS,AMS再判断进程没有创建的话就发送指令到zygote,zygote再创建app进程
同样也是获取Runnable对象
到这边就和上面的system_server的创建一样了,最后是调用到ActivityThread.java的main函数
以上就是zygote创建进程的简单理解,有不对的地方欢迎指出。