美文网首页
深入理解Zygote

深入理解Zygote

作者: nziyouren | 来源:发表于2017-05-21 17:41 被阅读0次

    首先记住一点Android系统中首先是native的世界,再由native进入到JAVA的世界!

    zygote本身是一个native可执行程序,有init进程根据init.rc里面配置项创建而来。zygote最初名字为app_process。zygote执行程序对应的源代码为App_main.cpp,源代码中通过调用AppRuntime(继承于AndroidRuntime)的start方法继续执行。

    AppRuntime主要依次执行以下几个步骤:

    (1)创建JAVA虚拟机startVm并设置虚拟机运行参数

      (2) 注册JNI函数(JNI分为主动注册和被动注册)

    (3)通过JNI调用,启动JAVA世界的ZygoteInit类的main方法,从此进入JAVA的世界

    JAVA世界中的ZygoteInit类依次进行以下几个关键步骤:

    (1)注册zygote跟其他进程通信使用的socket。需要注意的是zygote跟系统中其他程序的通信没有使用Binder,而是采用了基于AF_UNIX类型的Socket.

     (2)预加载类和资源 preloadClasses(), preloadResources(). Android系统启动较慢其中一个重要原因就是预先加载了1000多个类。

    (3)根据AppRuntime给ZygoteInit传递的启动system_server参数(一般都为true)采用fork的形式启动system_server进程。

    (4)zygote执行runSelectLoopMode()进行循环等待模式,等待其他进程通过socket给她发消息

    SystemServer进程作为Android系统重要服务的存储地(其实Android系统里面比较重要的工作都是由system server来完成的),由于太重要了,所以她的生命都是跟zygote捆绑在一起的,zygote发现system server挂了后,也会杀死自己。重启整个zygote和system server。

    SystemServer几个关键流程:

    (1)Zygote通过fork创建system server进程,对应源代码为dalvik_system_Zygote.c,创建之前设置相应的信号处理函数,用来监听system server的状态

    (2)调用RuntimeInit.java中的zygoteInit方法->zygoteInitNavite,启动一个线程用于Binder通信

    (3)调用JAVA世界中SystemServer.class的main方法,加载libandroid_servers.so->native世界的init1方法->system_init() 初始化binder通信相关->调用init2()方法,启动android.server.ServerThread,ServerThread初始化Entropy Service, PowerManagerService, BatteryService 添加到ServiceManager, 并初始化和启动看门狗Watchdog后再启动WindowManager服务和ActivityManager服务

    zygote分裂图示(引用深入理解Android邓凡平老师的一张图):

    相关文章

      网友评论

          本文标题:深入理解Zygote

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