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

本文介绍了Android系统中zygote进程的启动流程及其如何创建Java世界,包括启动AppRuntime、创建Java虚拟机、预加载类和资源等关键步骤。此外,还详细描述了system_server的创建过程以及它在系统中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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运行起来了。

 

转载于:https://www.cnblogs.com/Jackwen/p/4317528.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值