zoukankan      html  css  js  c++  java
  • [5] Zygote

    Android设备中的两大进程,如下图




    1,由init进程创建的Daemon进程
    2,由 Zygote进程创建的应用程序进程

    什么是Zygote?
    zygote是“受精卵”的意思。在Android里,它是一个进程(java编写的)


    Zygote进程怎么创建?
    init进程启动完系统所需的各种daemon后,通过 app_process进程启动Zygote进程,如下图


    什么app_process进程?

    Zygote由java编写,不能直接由init进程启动,这时就要用到app_process进程。该进程先创建Dalvik虚拟机,再装载运行ZygoteInit类。如下图
    1,init进程通过init.rc启动app_process进程
    2,app_process进程创建Dalvik虚拟机
    3,装载运行ZygoteInit类
    4,ZygoteInit::main()函数绑定套接字,加载资源,启动SystemServer,处理新Android应用运行请求
    5,Zygote进程创建完毕



    Zygote作用?

    执行Android的应用程序,即apk。

    Tip:apk应用程序由java编写,不能以本地进程的形态运行在linux上,需运行在Dalvik虚拟机中。每个应用程序都运行在各自的虚拟机中,在linux里也表现为独立的进程。


    Zygote优点?

    运用类型于linux的fork克隆技术,缩短apk加载运行的时间。


    那么,在Linux中创建并运行一个进程,与在Android中通过Zygote来创建并运行一个进程,有何不同?
    在Linux中,新进程( 如B)是由父进程(如 A)通过fork()创建 A',子进程 A'再通过exec()将新进程B代码加载到内存,B运行。
    在Android中,所有的新App进程(如Application A),都是由zygote通过fork()创建zygote', Application A 的代码被动态复制到zygote'内的dalvik虚拟机上,而后zygote'把执行流程交给 Application A , Application A 开始运行。
    共同点:都用fork()创建
    不同点:android应用程序A并非通过fork()来重新装载已有进程的代码区,而是被动态加载到复制出的zygote' 内的Dalvik虚拟机上。

    下图是Linux创建运行新进程--流程图


    下图是Android创建运行新进程(应用程序)--流程图




    下图是Zygote如何运行新应用程序的流程图



  • 相关阅读:
    C++中用Int转成bool时,只有0是false,其他都是true。这个和其他语言很不一样,注意不要掉坑里了。
    C# 获取动态验证码?
    Silverlight单元格事件
    LDAPHelper
    Perl内部保留变量(系统变量)
    WebSphere MQ基础命令
    老鼠, 老虎傻傻分不清楚之Double.NaN
    TextBlock or Label?
    如何阅读代码
    EDID
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3265321.html
Copyright © 2011-2022 走看看