码迷,mamicode.com
首页 > 移动开发 > 详细

《深入理解Android》学习笔记(三) ——— zygote

时间:2015-03-06 15:26:14      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!