详细分析Android-Zygote的启动过程
目录
- 创建Socket
- 启动SystemServer
- 等待AMS
在启动Zygote的时候,会根据ro.zygote属性来控制使用不同的Zygote启动脚本。启动脚本放在System/core/rootdir目录中。
文章图片
Zygote在启动的时候会走到ZygoteInit的main方法,在这个方法中主要做了以下这些事:
- 创建一个Server端的Socket
- 预加载类和资源
- 启动SystemServer进程
- 等待AMS请求创建新的应用程序进程
Zygote创建的Socket的name为zygote,用于等待ActivityManagerService请求Zygote创建新应用程序进程。
在启动了SystemServer进程后,系统的服务也会由SystemServer进程启动起来。
最后就会调用方法,等待AMS请求创建新的应用程序进程。
创建Socket
在创建Socket的时候,会创建一个名字,名字为【ANDROID_SOCKET_zygote】,通过这个名字获取环境变量的值,文件描符参数,最后创建一个文件描述符,在生成LocalServerSocket的时候传入。这个也就是服务端的Socket。Zygote将SystemServer进程启动后,就会在这个服务端的Socket上等待AMS的信号。
启动SystemServer
需要先创建一个args数组,用来保存启动SystemServer的启动参数。SystemServer进程的用户id和用户组id设置为1000,进程名字为system_server,启动的类名为:com.android.server.SystemServer。接着会调用Zygote的forkSystemServer方法,其内部会调用nativeForkSystemServer这个Native方法,最终通过fork函数在当前进程创建一个子进程,就是SystemServer进程。如果forkSystemServer方法返回的pid为0,表示当前代码运行在新创建的子进程中,则会执行handleSystemServerProcess来处理SystemServer进程。
等待AMS
获取到前面创建的Socket的fd字段的值,添加到一个fds列表中。接下来就无限循环等待AMS的请求。会有一个无限循环,在这个循环中会将fds的数据转移到pollFds数组上,然后对pollFds进行遍历,遍历的同时会判断当前Zygote进程是否与AMS建立了连接。如果建立了连接,调用acceptCommamdPeer方法得到ZygoteConnection类并添加到Socket连接列表peers中。然后将ZygoteConnection的fd添加到fds列表中,以便可以接收AMS发送过来的请求。如果在遍历pollFds的时候不是与AMS建立连接,那么就是创建应用的请求,回调用ZygoteConnection的runOnce方法创建一个新的应用程序进程,创建成功后会将这个Socket从peers和fds中清除。
Zygote进程启动总结:
- 启动Zygote进程
- 创建虚拟机,为Java虚拟机注册JNI方法
- 通过JNI调用ZygoteInit的main函数,进入Java框架层
- 通过registerZygoteSocket方法创建服务端Socket,通过funSelectLoop方法等待AMS请求。
- 启动SystemServer进程
推荐阅读
- 如何寻找情感问答App的分析切入点
- D13|D13 张贇 Banner分析
- 自媒体形势分析
- 2020-12(完成事项)
- Android事件传递源码分析
- Python数据分析(一)(Matplotlib使用)
- 泽宇读书会——如何阅读一本书笔记
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- ffmpeg源码分析01(结构体)
- 关于两种潜能生的性格分析