标签:
1. zygote 本身是一个Native的应用程序,与驱动,内核无关,由init进程根据init.rc的配置项创建起来的。
2. zygote 是创建java世界的盘古,创建java世界的步骤:
(1) 创建AppRuntime对象,并调用它的start。此后的活动由AppRuntime控制。
(2) 调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
(3) 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,进入Java世界。
(4) 调用registerZygoteSocket建立socket作为IPC通信服务端,通过这个函数,zygote可以响应子孙后代的请求。同时,zygote通过调用preloadClasses和preloadResouces来预加载类和资源。
(5) 通过startSystemServer创建一个进程system_server来为Java世界服务。该进程是framework的核心,Java世界中系统的Services都驻留在该进程。
(6) zygote调用runSelectLoopMode函数进入循环,这个函数使用到了(4)中的socket。这个函数主要用于处理客户连接和客户请求。其中客户在zygote中用ZygoteConnection对象来表示,客户的请求由ZygoteConnection的runOnce来处理。
3. SystemServer(system_server)诞生过程:
(1) ZygoteInit调用startSystemServer创建system_server进程。
(2) system_server调用handleSystemProcess完成自己的使命。
(3) handleSystemProcess抛出异常,最终调用com.android.SystemServer的main函数。
(4) main函数加载libandroid_server.so,并调用native的init1函数。
(5) init1函数通过JNI调用com.android.SystemServer的init2函数,init2函数创建一个线程,用于加载各种Services。
(6) init1函数最终使进程的主线程加入Binder通信系统中。
4. zygote分裂繁殖例子
ActivityManagerService由SystemServer创建, 并驻留在SystemServer进程中。使用startActivity来启动新的Activity,该Activity附属于一个还未启动的进程,该进程启动过程:
(1) ActivityManagerService向zygote发送请求消息。
(2) 每当有请求数据发来时,zygote的runSelectLoopMode函数中就就会调用ZygoteConnection的runOnce函数中fork创建子进程。
(3) 子进程调用android.app.ActivityThread的main函数。 android.app.ActivityThread实际上是Android中apk程序所对应的进程,它的main函数就是apk程序的main函数。自此,新的activity运行起来了。
《深入理解Android》学习笔记(三) ——— zygote
标签:
原文地址:http://www.cnblogs.com/Jackwen/p/4317528.html