`
dawuafang
  • 浏览: 1108053 次
文章分类
社区版块
存档分类
最新评论

Android4.4 Framework分析——Zygote进程的启动过程

 
阅读更多

Android启动过程中的第一个进程init,在启动过程中会启动两个关键的系统服务进程ServiceManager和Zygote。本文要介绍的就是Zygote进程的启动,Zygote俗称孵化器,专门用于生产(启动)新的进程。Zygote是在Init.rc(aosp/system/core/rootdir)里描述并由init进程启动的。相关代码如下:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd
init.rc文件的语法描述可以参考aosp/system/core/init/readme.txt。

zygote的path路径为/system/bin/app_process,-Xzygote /system/bin --zygote --start-system-server是它的参数,所属class是main,同属同一个class的进程会同时启动或者停止,会启动一个socket名为zygote,重启时将做四个操作。

下面是Zygote进程启动的大致时序图:


Android启动过程中,init进程使用aosp/system/core/init/Init_parser.c解析init.rc脚本文件。

step1,循环启动init.rc文件描述的所有状态不为SVC_DISABLED的service,fork()新进程。

step2,启动Zygote,执行app_main.cpp的main()方法,

    // Parse runtime arguments.  Stop at first unrecognized option.
    bool zygote = false;
    bool startSystemServer = false;
    bool application = false;
    const char* parentDir = NULL;
    const char* niceName = NULL;
    const char* className = NULL;
    while (i < argc) {//main的参数匹配
        const char* arg = argv[i++];
        if (!parentDir) {
            parentDir = arg;
        } else if (strcmp(arg, "--zygote") == 0) {
            zygote = true;
            niceName = "zygote";
        } 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 = arg + 12;
        } else {
            className = arg;
            break;
        }
    }

    if (niceName && *niceName) {
        setArgv0(argv0, niceName);
        set_process_name(niceName);
    }

    runtime.mParentDir = parentDir;

    if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit",
                startSystemServer ? "start-system-server" : "");
    } else if (className) {
        ......
    } else {
        ......
    }
step3,启动AppRuntime,AppRuntime继承自AndroidRuntime,这里需要做的事情有:

    /* start the virtual machine */
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env) != 0) {//step4,创建JVM
        return;
    }
    onVmCreated(env);

    /*
     * Register android functions.
     */
    if (startReg(env) < 0) {//step6,在JVM中注册android本地方法
        ALOGE("Unable to register all android natives\n");
        return;
    }

step7~step8,启动ZygoteInit的main()方法,传入一个字符串数组,strArray[0]="com.android.internal.os.ZygoteInit",strArray[1] = "start-system-server"。

step9,registerZygoteSocket()注册服务端socket,这个socket就是前面提到的zygote,在init进程解析init.rc时创建。


   public static void main(String argv[]) {
        try {
            // Start profiling the zygote initialization.
            SamplingProfilerIntegration.start();

            registerZygoteSocket();
            .......
            preload();
            .......

            // Do an initial gc to clean up after startup
            gc();
            ......

            if (argv[1].equals("start-system-server")) {
                startSystemServer();//step11
            } else if (!argv[1].equals("")) {
                throw new RuntimeException(argv[0] + USAGE_STRING);
            }

           runSelectLoop();

            closeServerSocket();
        } catch (MethodAndArgsCaller caller) {
            caller.run();
        } catch (RuntimeException ex) {
            Log.e(TAG, "Zygote died with exception", ex);
            closeServerSocket();
            throw ex;
        }

step11,开始启动SystemServer进程,系统启动的关键进程。

  private static boolean startSystemServer()
            throws MethodAndArgsCaller, RuntimeException {
         ......
        /* Hardcoded command line to start the system server */
        String args[] = {
            "--setuid=1000",
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1032,3001,3002,3003,3006,3007",
            "--capabilities=" + capabilities + "," + capabilities,
            "--runtime-init",
            "--nice-name=system_server",
            "com.android.server.SystemServer",
        };
        ZygoteConnection.Arguments parsedArgs = null;

        int pid;

        try {
            .......

            /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

        /* For child process */
        if (pid == 0) {
            handleSystemServerProcess(parsedArgs);//step12
        }

        return true;
    }

Zygote.forkSystemServer()中会fork出一个新进程,是即将启动的SystemServer进程,是Zygote的子进程。如果成功fork出新的子进程,这里将会返回两次,一次返回Zygote的pid,值大于0,这里返回执行step29,进入loop,等待ActivityManagerService调用startProcessLocked()启动新的进程,这个过程参考Android4.4 framework分析——startService的创建过程的step12~step35;另一次返回SystemServer的进程id,等于0,将执行step12~step28。


参考:

http://blog.csdn.net/luoshengyang/article/details/6768304

www.cnblogs.com/bastard/archive/2012/08/28/2660389.html


右键复制图片地址,在浏览器中打开即可查看大图。

未完待续,有不对的地方,请指正。


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    Android系统进程Zygote启动过程的源代码分析.pdf

    Android系统进程Zygote启动过程的源代码分析.pdf

    探索Android FrameWork底层开发视频全套

    3.Android编译过程分析 4.android.mk初识 5.Android.mk学习1 6.Android.mk学习2 7.Android.mk学习3 8.Android启动课程大纲 9.Android启动模式 10.init启动分析 11.走入init启动脚本 12.init脚本解析分析 13.init脚本...

    Android启动-Zygote启动介绍

    Android启动,第二大阶段,Zygote启动。 紧接上一篇《 Android启动-init介绍》Linux内核启动之后,执行第一个进程 Init,init会启动本地服务,创建Zygote等。 这里我们就来研究一下Zygote启动过程。

    zygote启动过程

    zygote启动过程zygote启动过程zygote启动过程zygote启动过程zygote启动过程

    Android Zygote启动流程源码解析

    Android Zygote启动流程源码解析

    Android 系统启动流分析 & Zygote启动流程分析

    Zygote在Android系统扮演着不可或缺的角色,Android系统的启动首先需要Zygote参与,比如启动SystemService , 还有一个就是孵化应用的进程,比如我们创建一个Activity也是需要Zygote参与.  Zygote 启动分为两个部分: 1....

    Android 8.1zygote服务 SystemServer启动流程 Activity创建

    Android zygote服务/SystemServer启动流程/Activity创建,本文档继承Android init的分析,继续往下分析Zygote进程、SystemServer进程的创建、Activity的建立

    Android应用程序进程管理

    这个PPT讲Android应用程序进程的启动和回收,主要涉及到Zygote进程、System Server进程,以及组件管理服务ActivityManagerService、窗口服务WindowManagerService,还有专用驱动Low Memory Killer。通过了解Android...

    详细分析Android中实现Zygote的

    概述 在Android系统中,所有的应用程序进程,以及用来运行系统关键服务的System进程都是由zygote进程负责创建的。...下面我们将介绍zygote进程的启动脚本,然后分析它和System进程的启动过程。 zygote分析

    《Android系统源代码情景分析》

    第12章 Android应用程序进程的启动过程 12.1 应用程序进程的创建过程 12.2 Binder线程池的启动过程 12.3 消息循环的创建过程 第13章 Android应用程序的消息处理机制 13.1 创建线程消息队列 13.2 线程...

    老罗的android之旅时序图

    (Android系统进程Zygote启动过程的源代码分析UML,Android系统默认Home应用程序(Launcher)的启动过程源代码分析uml,Android系统在新进程中启动自定义服务过程(startService)的原理分析UML,Android应用程序...

    Android_启动过程分析

    Android 启动过程分析 首先看看整体开机流程。这个对于软件开发测试工作非常有用,特别是在项目初期的时候,通常出在驱动或者启动参数上面的问题比较多,比如关机充电,连接charger关机等问题。 一般开机过程大致...

    Android系统源代码情景分析-罗升阳-源码

    第12章 Android应用程序进程的启动过程 12.1 应用程序进程的创建过程 12.2 Binder线程池的启动过程 12.3 消息循环的创建过程 第13章 Android应用程序的消息处理机制 13.1 创建线程消息队列 13.2 线程消息循环...

    模拟Android系统Zygote启动流程

    模拟Android系统Zygote启动流程

    Android-start-boot-analyze-.rar_android_android bootloader_andro

    Android系统启动过程分析 本文主要介绍Android系统的启动过程,以Androidinit进程之后部分为主,init之前部分同标准Linux内核启动完全相同。于Android启动过程复杂,涉及C、C++及java部分内容,本文以流程分析为主线...

    Android Framework实战开发篇

    广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统...-学习zygote的进程创建过程源码分析 -学习zygote启动systemserver过程分析 -学习systemserver的启动分析 -学习systemserver的Home

    Android系统源代码情景分析 / 罗升阳著

    第11章 Zygote和System进程的启动过程 第12章 Android应用程序进程的启动过程 第13章 Android应用程序的消息处理机制 第14章 Android应用程序的键盘消息处理机制 第15章 Android应用程序线程的消息循环模型 第...

    Android10.0 Binder通信原理(八)-Framework层分析

    摘要:本节主要来讲解Android10.0 Binder 在Framework的使用分析 阅读本文大约需要花费15分钟。 文章首发微信公众号:IngresGe ... Android10.0系统启动之Zygote进程 Android 10.0 系统启动之SystemServer进

    Zygote启动流程-systemServer启动流程-homeLauncher启动

    zygote启动流程源码分析, 文件包含zygote systemService activityManager启动homeLauncher. 因为本地文字较长 不方便写blog发布 所以上传一下文档

Global site tag (gtag.js) - Google Analytics