• ZygoteInit源码解读


    由app_main.cpp文件中调用ZygoteInit.java  进行创建第一个虚拟机。

    init.rc中可以设置与其相关的参数:

    1. service zygote /system/bin/app_process -Xzygote    告诉操作系统 Zygote加入到系统服务中
      -Xzygote,该参数将作为虚拟机启动时所需要的参数,是在AndroidRuntime.cpp类的startVm()函数中调用JNI_CreateJavaVM()时被使用的
    2. /system/bin --zygote --start-system-server             --开头的都是参数  比如--start-system-server指的是Zygote进程复制产生的第一个虚拟机实例是系统服务进程
    3.     socket zygote stream 666                                   指定该服务所使用到的socket,后面的参数依次是名称、类型、端口地址 当用户启动一个新的应用时会通过socket告知Zygote,让她孵化出一个新的虚拟机实例
    4.     onrestart write /sys/android_power/request_state wake  重启的条件  一般都是发生异常
    5.     onrestart write /sys/power/state on  
    6.     onrestart restart media  
    7.     onrestart restart netd
    1.  public static void main(String argv[]) { 这是ZygoteInit.java的main函数 从AndroidRuntime::start()进入此函数
    2.         try {
    3.             // Start profiling the zygote initialization.
    4.             SamplingProfilerIntegration.start();
    5.             registerZygoteSocket(); 启动Socket服务端口 用于监听
    6.             EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
    7.                 SystemClock.uptimeMillis());
    8.             preload(); 加载Framework大部分类和资源
    9.             EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
    10.                 SystemClock.uptimeMillis());
    11.             // Finish profiling the zygote initialization.
    12.             SamplingProfilerIntegration.writeZygoteSnapshot();
    13.             // Do an initial gc to clean up after startup
    14.             gc();
    15.             // If requested, start system server directly from Zygote
    16.             if (argv.length != 2) {
    17.                 throw new RuntimeException(argv[0] + USAGE_STRING);
    18.             }
    19.             if (argv[1].equals("start-system-server")) { 检查参数是否对
    20.                 startSystemServer();
    21.             } else if (!argv[1].equals("")) {
    22.                 throw new RuntimeException(argv[0] + USAGE_STRING);
    23.             }
    24.             Log.i(TAG, "Accepting command socket connections");
    25.             if (ZYGOTE_FORK_MODE) { 复制孵化出一个虚拟机 产生一个新的进程 共享Framework的类和资源 (复制要比创建速度快)
    26.                 runForkMode();
    27.             } else {
    28.                 runSelectLoopMode();
    29.             }
    30.             closeServerSocket();
    31.         } catch (MethodAndArgsCaller caller) {
    32.             caller.run();
    33.         } catch (RuntimeException ex) {
    34.             Log.e(TAG, "Zygote died with exception", ex);
    35.             closeServerSocket();
    36.             throw ex;
    37.         }

    关于进程的创建大概分三部分

    1.内核创建一个进程数据结构,用于表示将要启动的进程

    2.内核调用程序装载器函数,从指定的程序文件读取程序代码,并将这些程序代码装载到预先设定的内存地址

    3.装载完毕后,内核将程序指针指向到目标程序地址的入口处开始执行指定的进程

    那为什么dalvik中要使用复制而不是创建呢? 只有两个进程中共享了大量的程序。Zygote函数只是个框架,并没有执行实际的程序,把这个框架复制给其他的应用程序,只需要把实际的内容填充到框架中。大概是这个意思吧。

    由于folk()函数是Linux的系统调用,Android中的Java层仅仅是对该调用进行了JNI封装而已,folk()函数是c实现的。

  • 相关阅读:
    2017-2018-1 20155232 嵌入式C语言——时钟
    实践——ELF文件格式分析
    实践——程序破解
    实践——模块
    《Linux内核分析》期终总结
    《Linux内核分析》第八周:进程的切换和系统的一般执行过程
    《Linux内核设计与实现》读书笔记六
    《深入理解计算机系统》读书笔记五
    《Linux内核分析》第七周: 可执行程序的装载
    《Linux内核设计与实现》读书笔记四
  • 原文地址:https://www.cnblogs.com/autum/p/Zygote.html
Copyright © 2020-2023  润新知