zygote最初的名字: app_process
zygote进程是由init进程fork出来, 其配置在init.rc
zygote进口在app_main.cpp->main()
app_main.cpp
int main(int argc, char* const argv[])
{
AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
//判断输入参数是否有--start-system-server
if (strcmp(arg, "--start-system-server") == 0) {
startSystemServer = true;
}
//调用 runtime的start
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}
}
runtime类型为AppRuntime,
AppRuntime定义在app_main.cpp内, 继承自AndroidRuntime, start函数即是执行AndroidRuntime的start
main(const char* className,){
if (startVm(&mJavaVM, &env, zygote) != 0) {} //启动Davim虚拟机
if (startReg(env) < 0) {} //注册Jni函数
//这边根据传进来的className->com.android.internal.os.ZygoteInit来执行ZygoteInit的main,正式进入到java世界
env->CallStaticVoidMethod(startClass, startMeth, strArray);
}
ZygoteInit文件main()
public static void main(String argv[]) {
//1. 注册socket
zygoteServer.registerServerSocket(socketName);
//2. 预加载,类和资源
preload();
//3. start systemserver
if (startSystemServer) {
startSystemServer(abiList, socketName, zygoteServer);
}
//4.进入循环监听
zygoteServer.runSelectLoop(abiList);
}
1. 注册socket, registerServerSocket, 注册IPC服务器端,通过socket方式
2. 预加载, preload();
static void preload() {
preloadClasses(); //预加载类
preloadResources(); //预加载资源
preloadOpenGL();
preloadSharedLibraries();
preloadTextResources();
}
接下来着重看下preloadClasses和preloadResources
preloadClasses: preloaded-classes文件通过工具生成,加载时间超过1250的加入到这个list.
private static void preloadClasses() {
//Preloaded_Classes存储与system中,可以通过cat查看,在工程中的位置framework/base
is = new FileInputStream(PRELOADED_CLASSES);//PRELOADED_CLASSES = "/system/etc/preloaded-classes";
}
preloadResource->加载framework-res.apk的资源
- 启动system server
SystemServer是Android Service驻留的进程, 是framework的核心, 如果systemServer死掉,zygote会自杀。
ZygoteInit.java
private static boolean startSystemServer(String abiList, String socketName, ZygoteServer zygoteServer){
//参数,UID = 1000, Gid = 1000
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"com.android.server.SystemServer",
};
//调用 Zygote的fork函数来启动SystemServer进程,返回进程ID
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids,
parsedArgs.debugFlags,
null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
/* For child process */
if (pid == 0) {//判断如果pid = 0,则处于子进程
handleSystemServerProcess(parsedArgs);
}
}
Zygote fork函数
public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags){
int pid = nativeForkSystemServer(
uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);
}
- 进入循环监听, APP进程也通过zygote进行孵化出来
调用ZygoteServer.runSelectLoop调用进入循环,这个函数里面会启动一个while无限循环
ZygoteConnection代表客户端
Zygote总结
(1)从app_main->main()入口进入,调用Appruntime的start()
(2)startVm创建虚拟机, startReg注册JNI
(3)调用ZygoteInit->main
(4)在 zygoteInit中注册socket, 预加载, 启动systemServer;
(5)最后进入循环loop,等待客户端通信~