美文网首页
系统启动,zygote

系统启动,zygote

作者: 唐僧不爱洗头_f7b5 | 来源:发表于2017-07-03 22:02 被阅读0次

    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的资源
    
    1. 启动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);
    }
    
    1. 进入循环监听, 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,等待客户端通信~
    

    相关文章

      网友评论

          本文标题:系统启动,zygote

          本文链接:https://www.haomeiwen.com/subject/bxlzcxtx.html