前言
在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的,因为Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。
Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。
PS: Android 版本:10
正文
system\core\init\init.cpp system\core\rootdir\init.rc # 存在多个zygote配置文件 system\core\rootdir\init.zygote32.rc system\core\rootdir\init.zygote32_64.rc system\core\rootdir\init.zygote64.rc system\core\rootdir\init.zygote64_32.rc
init.rc
在init.rc中
import /init.${ro.zygote}.rc
具体启动哪个,需要看ro.zygote的配置。
这个参数可以通过getprop获取
adb shell getprop ro.zygote zygote32
也就是说我这里启动的是init.zygote32.rc配置:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server --enable-lazy-preload class main priority -20 user root group root readproc reserved_disk socket zygote stream 660 root system onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart audioserver onrestart restart cameraserver onrestart restart media onrestart restart netd onrestart restart wificond writepid /dev/cpuset/foreground/tasks
简单解释一下:
启动的是service名为zygote,路径为/system/bin/app_process,后面带的参数和服务的约束条件。
具体请看《[摘]Android源码之init.rc文件规则和init.c解析》
从上面知道,要启动的是app_process32,它位于frameworks\base\cmds\app_process/app_main.cpp文件中,入口函数是main。
可以看frameworks\base\cmds\app_process\Android.mk的编译语法。
app_process64和app_process32都是通过frameworks/base/cmds/app_process编译出来的
app_main.cpp
frameworks\base\cmds\app_process\app_main.cpp
直接看main函数入口(删除部分代码):
int main(int argc, char* const argv[]) { ...... //省略 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; } } ..... //省略 if (zygote) { runtime.start("com.android.internal.os.ZygoteInit", args, zygote); } else if (className) { runtime.start("com.android.internal.os.RuntimeInit", args, zygote); } else { fprintf(stderr, "Error: no class name or --zygote supplied.\n"); app_usage(); LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied."); } }
main()中将init.zygote32.rc中指定的-Xzygote参数传给JVM,将进程的名字改为zygote(PS:上面代码没有附上,自己看源码),执行AppRuntime类的start()方法。
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
AndroidRuntime
从上面(app_main.cpp中定义了)知道AppRuntime 继承于AndroidRuntime
frameworks\base\core\jni\AndroidRuntime.cpp
我们看AndroidRuntime的start的方法
1. jni_invocation.Init()方法初始化jni接口 2. startVm()方法创建虚拟机 3. startReg()方法注册Android方法 4. CallStaticVoidMethod()方法打开ZygoteInit类的main方法。完成从c/c++到java代码。 void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote) { ..... //略 //环境变量ANDROID_ROOT的值被设置成了/system,接着定义了一些变量。 const char* rootDir = getenv("ANDROID_ROOT"); if (rootDir == NULL) { rootDir = "/system"; if (!hasDir("/system")) { LOG_FATAL("No root directory specified, and /android does not exist."); return; } setenv("ANDROID_ROOT", rootDir, 1); } // JNI接口的初始化 jni_invocation.Init(NULL); //启动虚拟机 if (startVm(&mJavaVM, &env, zygote) != 0) { return; } // 调用startReg方法,注册android方法 if (startReg(env) < 0) { ALOGE("Unable to register all android natives\n"); return; } //className的值是com.android.internal.os.ZygoteInit //调用CallStaticVoidMethod方法,启动ZygoteInit.main() if (startClass == NULL) { /* keep going */ } else { jmethodID startMeth = env->GetStaticMethodID(startClass, "main", "([Ljava/lang/String;)V"); if (startMeth == NULL) { /* keep going */ } else { // 启动 env->CallStaticVoidMethod(startClass, startMeth, strArray); #if 0 if (env->ExceptionCheck()) threadExitUncaughtException(env); #endif } } free(slashClassName); ALOGD("Shutting down VM\n"); ..... //略 }
主要启动Android系统运行时库,它主要做了三件事情:
- 一是调用函数startVM启动虚拟机
- 二是调用函数startReg注册JNI方法
- 三是调用了com.android.internal.os.ZygoteInit类的main函数
因此启动了ZygoteInit.java
ZygoteInit.java
frameworks\base\core\java\com\android\internal\os\ZygoteInit.java
public static void main(String argv[]) { ......// 略 try { //注册registerServerSocketFromEnv zygoteServer.registerServerSocketFromEnv(socketName); // 预加载资源 preload(bootTimingsTraceLog); preloadResources(); preloadTextResources(); //初始化GC gcAndFinalize(); // 启动SystemServer if (startSystemServer) { Runnable r = forkSystemServer(abiList, socketName, zygoteServer); //启动完SystemServer之后会返回一个Runnable对象,在父进程Zygote中该Runnable对象为null, //子进程SystemServer中不为null,会在SystemServer进程中执行该Runnable对象 if (r != null) { r.run(); return; } } // 启动looper循环 caller = zygoteServer.runSelectLoop(abiList); } catch (Throwable ex) { Log.e(TAG, "System zygote died with exception", ex); throw ex; } finally { //退出后就关闭socket zygoteServer.closeServerSocket(); } ......//略 }
上面主要的任务是:
- registerServerSocketFromEnv
- preload预加载资源
- 通过gcAndFinalize()初始化GC
- forkSystemServer
- runSelectLoop
- 退出后,关闭closeServerSocket
参考文章