init进程
启动电源,加载引导程序,引导程序启动Linux内核,Linux内核加载完成后,首先启动 init 进程,
通过 init.rc 文件启动 init 进程,而这些文件位于源码目录:system/core/init
init 进程的工作:
- 创建和挂载启动所需的文件目录
- 初始化和启动属性服务
- 解析 init.rc 配置文件并启动 Zygote 进程。
僵尸进程与危害
在 UNIX/Linux 中,父进程使用 fork 创建子进程,在子进程终止后,如果父进程并不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还为它保留了一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称为僵尸进程
。系统进程表是一项有些有限资源,如果系统进程表被僵尸进程耗尽的话,系统就可能无法创建新的进程了。
为了防止僵尸进程,系统会在子进程(如 Zygote)暂停和终止时发出SIGCHLD
信号,而signal_handler_init
函数接收 SIGCHLD信号后(其内部只处理进程终止的SIGCHLD
信号),会调用handle_signal
函数,最终会找到Zygote
进程并移除所有Zygote进程的信息,然后再重启Zygote进程。
Zygote进程
Zygote启动脚本位于:system/core/rootdir
,根据不同的系统来启动不同的脚本
- init.zygote32.rc 支持纯32位程序
- init.zygote32_64.rc 32、64位程序都支持,只是32位作为主模式,63作为辅模式
- init.zygote64.rc
- init.zygote64_32.rc
最终在AndroidRuntime.cpp中通过 JNI 调用了 ZygoteInit 的main方法,而这个 ZygoteInit是Java语言编写的,这样 Zygote就从Native层进入了 Java框架层。
换句话说:Zygote开创了Java框架层。
Zygote启动工作总结:
- 创建AppRuntime并调用其start方法,启动Zygote进程
- 创建Java虚拟机并为Java虚拟机注册JNI方法。
- 通过JNI调用ZygoteInit的 main 函数进入Zygote的Java框架层
- 通过 registerZygoteSocket 方法创建服务器端Socket,并通过 runSelectLoop方法等待AMS的请求来创建新的应用程序进程
- 启动SystemServer进程
网友评论