博客同步至github博客:Zygote进程启动流程
使用到的相关源码:https://github.com/JesusYoung/AndroidResourceCode9.0/tree/master
基于Android 9.0
1、Zygote进程
Zygote是在init进程启动时创建的,它又称为孵化器,它可以通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程,并且,Zygote进程在启动的时候会创建DVM或者ART,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或者ART的实例副本;
2、Zygote进程启动流程
2.1、Init进程调用
2.1.1、解析配置参数
Init进程启动之后,解析init.rc配置文件,执行其配置,其中有启动Zygote进程的参数配置,在app_main.cpp的main()方法中,先解析参数,例如在前面解析.rc文件时添加的参数“–zygote、----start-system-server”等,初始化各种标识位;
int main(int argc, char* const argv[]) {
...
++i; // Skip unused "parent dir" argument.
while (i < argc) {
const char* arg = argv[i++];
if (strcmp(arg, "--zygote") == 0) {
zygote = true;
niceName = ZYGOTE_NICE_NAME;
} else if (strcmp(arg, "--start-system-server") == 0) {
startSystemServer = true;
} else if (strcmp(arg, "--application") == 0) {
application = true;
} else if (strncmp(arg, "--nice-name=", 12) == 0) {
niceName.setTo(arg + 12);
} else if (strncmp(arg, "--", 2) != 0) {
className.setTo(arg);
break;
} else {
--i;
break;
}
}
...
}
2.1.2、启动Dalvik虚拟机
接着判断className是否为空,在Zygote模式下,调用maybeCreateDalvikCache()函数创建Dalvik虚拟机缓存,添加启动systemServer的参数标识;
int main(int argc, char* const argv[]) {
...
if (!className.isEmpty()) {
...
} else {
// We're in zygote mode.
maybeCreateDalvikCache();
if (startSystemServer) {
args.add(String8("start-system-server"));
}
char prop[PROP_VALUE_MAX];
if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0